我目前正在尝试将.txt文件导入某些专有软件,但似乎不断收到错误..txt文件大小近2GB,大约有5600万行.
在与制造商交谈后,他们表示其中一条线路可能存在错误.每行应包含一个MD5哈希值(32个字符),因此,使用Python v2.7,我希望扫描处理.txt文件以检查每行的长度并打印'违规'行的值.
这是我尝试过的: -
f = open("x.txt")
contents = f.readlines()
f.close()
for line in contents:
if line(len) == 32:
continue
else:
print line
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试这段代码时收到错误: -
File "<pyshell#30>", line 2, in <module>
if line(len) == 32:
TypeError: 'str' object is not callable
Run Code Online (Sandbox Code Playgroud)
所以我尝试了以下相信我必须将'line'转换为整数: -
for line in contents:
if int(line)(len) == 32:
continue
else:
print line
Run Code Online (Sandbox Code Playgroud)
但这只是带来了错误: -
ValueError: invalid literal for int() with base 10: '000000000000000012452154365298BD"
Run Code Online (Sandbox Code Playgroud)
如上所述,我要做的是读取.txt文件的每一行,如果它不是有效的MD5哈希值,则将值打印到屏幕甚至删除该值.
非常感谢
[编辑]原来这是一个小学生的错误.谢谢大家
由于您的文件大小为2 GB,我建议不要按照您的方式进行,即使您更正line(len)了len(line).您正在将整个文件读入内存,这是不必要的,如果您没有足够的RAM,可能会导致内存不足错误.这是我如何做到的:
with open("x.txt") as f:
for line_no, line in enumerate(f):
# Remember not to count the newline character
if len(line.strip()) != 32:
print line_no, line
Run Code Online (Sandbox Code Playgroud)
如果要删除具有错误字符数的所有行,最简单的方法是编写一个新的正确文件:
with open("outfile.txt", "w") as out:
with open("x.txt") as f:
for line_no, line in enumerate(f):
if len(line.strip()) == 32:
out.write(line)
else:
print "Removing line {0}".format(line_no)
Run Code Online (Sandbox Code Playgroud)
脚本运行后,检查新文件是否正常,然后将旧文件移动到备份目录并重命名新文件x.txt.