Python 3.x Python索引器错误:列表索引超出范围大文件

Python 3.x Python索引器错误:列表索引超出范围大文件,python-3.x,indexoutofboundsexception,large-files,Python 3.x,Indexoutofboundsexception,Large Files,我有一个非常大的文件~40GB和674877098行,我想从中读取和提取特定列。我可以得到大约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 代码 我已经查看了发生错误时正在读取的文件,

我有一个非常大的文件
~40GB
674877098
行,我想从中读取和提取特定列。我可以得到大约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
代码


我已经查看了发生错误时正在读取的文件,但我没有发现该文件有任何错误,因此我不知道该错误的原因。

可能有一行中有一个逗号,或者没有,或者是空行,等等。可能只是在语句周围放一个try-except语句,然后捕获索引错误,可能打印出有问题的行,您应该这样做。除此之外,您的代码中还有一些值得改进的地方

  • 请特别查看
    csv
    模块。它有一些优化的C代码,完全适合您想要做的事情,所以它应该快得多。这主要显示了如何使用
    csv
    编写迭代
  • 整个切片构造似乎是多余的。对f:中的行执行一个简单的
    ,这是处理此迭代最有效的方法
  • 直接使用
    line.split(',')
    ,而不是先用空格替换它们
  • 将open(F)作为F:使用
    ,而不是自己调用close。对于这个脚本,它可能没有什么区别,但这样可以确保,例如,在出现错误时,您不会创建打开的文件句柄

感谢您尝试一下。另一个提示:如果您不是纯粹为了学习体验而这样做,并且如果您必须更频繁地处理CSV,您可能还想尝试一下,这是一个非常快速和通用的工具,可用于此类简单的CSV操作。
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()