Python IndexError:列表索引超出范围的大文件

时间:2015-02-22 06:50:00

标签: python-3.x indexoutofboundsexception large-files

我有一个非常大的文件~40GB674,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()

我查看了发生错误时正在读取的文件,但我没有看到该文件有任何问题,所以我对此错误的原因感到茫然。

1 个答案:

答案 0 :(得分:1)

有可能,有一些行可能只有一个逗号,或者没有,或者是空行,无论如何。可能只是在语句周围放置一个try-except语句并捕获索引错误,可能打印出有问题的行,你应该完成。除此之外,您的代码中还有一些内容可能值得改进。

  • 尤其要看csv模块。它有一些优化的C代码,完全符合您的要求,因此它应该更快。此answer主要显示如何使用csv编写迭代。
  • 整个切片构造似乎是多余的。一个简单的for line in f:将会是并且是处理此迭代的最有效方法。
  • 直接使用line.split(','),而不是先用空格替换它们。
  • 使用with open(F) as f:而不是自己打电话。对于这个脚本,它可能没什么区别,但这样你确保,例如,如果出现错误,请不要创建打开的文件句柄。