我有一个非常大的文件~40GB
和674,877,098
行我想要阅读并从中提取特定列。我可以获得大约3GB
个传输的数据,然后我收到以下错误。
Traceback (most recent call last):
File "C:\Users\Codes\Read_cat_write.py", line 44, in <module>
tid = int(columns[2])
IndexError: list index out of range
正在读取的数据样本。
1,100000000,100000000,39,2.704006988169216e15,310057,0
2,100000001,100000000,38,2.650346740514816e15,303904,0.01
3,100000002,100000000,37,2.136985003098112e15,245039,0.03
4,100000003,100000000,36,2.29479163101184e15,263134,0.05
5,100000004,100000000,35,1.834645477916672e15,210371,0.06
6,100000005,100000000,34,1.814063860416512e15,208011,0.08
7,100000006,100000000,33,1.808883592986624e15,207417,0.1
8,100000007,100000000,32,1.806241248575488e15,207114,0.12
9,100000008,100000000,31,1.651783621410816e15,189403,0.14
10,100000009,100000000,30,1.634821184946176e15,187458,0.16
代码
from itertools import islice
F = r'C:\Users\Outfiles\comp_cat_raw.txt'
w = open(r'C:\Users\Outfiles\comp_cat_3col.txt','a')
def filesave(TID,M,R):
X = str(TID)
Y = str(M)
Z = str(R)
w.write(X)
w.write('\t')
w.write(Y)
w.write('\t')
w.write(Z)
w.write('\n')
N = 680000000
f = open(F) #Opens file
f.readline() # Strips Header
nlines = islice(f, N) #slices file to only read N lines
for line in nlines:
if line !='':
line = line.strip()
line = line.replace(',',' ') # Replace comma with space
columns = line.split() # Splits into column
tid = int(columns[2])
m = float(columns[4])
r = float(columns[6])
filesave(tid,m,r)
w.close()
我查看了发生错误时正在读取的文件,但我没有看到该文件有任何问题,所以我对此错误的原因感到茫然。
答案 0 :(得分:1)
有可能,有一些行可能只有一个逗号,或者没有,或者是空行,无论如何。可能只是在语句周围放置一个try-except语句并捕获索引错误,可能打印出有问题的行,你应该完成。除此之外,您的代码中还有一些内容可能值得改进。
csv
模块。它有一些优化的C代码,完全符合您的要求,因此它应该更快。此answer主要显示如何使用csv
编写迭代。for line in f:
将会是并且是处理此迭代的最有效方法。line.split(',')
,而不是先用空格替换它们。with open(F) as f:
而不是自己打电话。对于这个脚本,它可能没什么区别,但这样你确保,例如,如果出现错误,请不要创建打开的文件句柄。