7

我正在使用巨大的 CSV 文件(20-2500 万行)进行操作,并且出于很多原因不想将它们拆分成更小的部分。

我的脚本使用csv模块逐行读取文件。我现在需要在下一次迭代(或刚刚读取)时读取的行的位置(字节数)。

我试过

>>> import csv
>>> f = open("uscompany.csv","rU")
>>> reader = csv.reader(f)
>>> reader.next()
....
>>> f.tell()
8230

但似乎csv模块按块读取文件。因为当我继续迭代时,我得到了相同的位置

>>> reader.next()
....
>>> f.tell()
8230

有什么建议么?请指教。

4

3 回答 3

8

如果“字节位置”是指字节位置,就好像您已将文件作为普通文本文件读取一样,那么我的建议就是这样做。逐行读取文件作为文本,并以这种方式获取行内的位置。csv您仍然可以使用该模块自己逐行解析 CSV 数据:

for line in myfile:
  row = csv.reader([line]).next()

我认为 CSV 阅读器提供这种字节位置是非常好的设计,因为它在 CSV 上下文中确实没有多大意义。毕竟,就 CSV 而言"data"data它们是完全相同的四个字节数据,但d可能是第二个字节或第一个字节,具体取决于是否使用了可选的环绕引号。

于 2012-08-24T13:17:07.560 回答
6

简短的回答:不可能。字节位置无法通过 csvreader API 获得

于 2012-08-24T12:48:36.293 回答
0

csv模块确实使用预读缓冲区读取块,如对这篇文章的响应中所建议的那样:

file.tell() 不一致

我对您有类似的需求,并将我的解决方案推广给可能正在做类似事情的其他人:

https://github.com/loisaidasam/csv-position-reader

希望能帮助到你!

于 2018-08-10T19:26:54.703 回答