如何知道python中CSV文件行的字节位置?

如何知道python中CSV文件行的字节位置?,python,file,csv,Python,File,Csv,我使用的是巨大的CSV文件(2000-2500万行),出于很多原因,我不想将它们分割成更小的部分 我的脚本使用csv模块逐行读取文件。我现在需要一个在下一次迭代中读取(或刚刚读取)的行的位置(字节数) 我试过了 >>> import csv >>> f = open("uscompany.csv","rU") >>> reader = csv.reader(f) >>> reader.next() .... >>

我使用的是巨大的CSV文件(2000-2500万行),出于很多原因,我不想将它们分割成更小的部分

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

我试过了

>>> import csv
>>> f = open("uscompany.csv","rU")
>>> reader = csv.reader(f)
>>> reader.next()
....
>>> f.tell()
8230
但csv模块似乎是按块读取文件的。因为当我继续迭代时,我得到了相同的位置

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

有什么建议吗?请给出建议。

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

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

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

我认为CSV阅读器不提供这种字节位置是一个非常好的设计,因为它在CSV上下文中没有多大意义。毕竟,就CSV而言,
“数据”和
数据是完全相同的四个字节的数据,但是
d
可能是第2个字节,也可能是第1个字节,这取决于是否使用了可选的周围引号。

csv
模块确实使用了一个预读缓冲区来读取块,正如在回复本文时所建议的:

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


希望有帮助

我怀疑这在
csv
中是不可能的。根据文件的结构,您可能只需要在分隔符上使用
str.split
,并使用常规文件对象…@mgilson不幸的是,我不能使用split,因为项目包含标准的CSV分隔符:引号、换行符等。这不起作用,因为项目包含标准的CSV分隔符:引号、换行符、,我需要字节位置,以便通过f.seek快速访问CSV文件中的某些数据,而不是使用CSV模块逐行读取。我的观点是,您可以以文本文件的正常方式读取文件。如果这涉及到使用
seek()
而不是行迭代器习惯用法,那就好了。在这两种情况下,您仍然可以使用
csv
模块来解析您需要解析的部分。问题是每个零件都必须是有效的CSV。我的意思是它不能在一列的中间结束。当我发布这个问题时,我寻找了一个非常简单的解决方案,不想编写额外的解析器等。csv位置读取器依靠readline一行一行地读取文件,然后实例化一个新的csv读取器,然后解析每一行。如果数据包含换行符,则此操作将失败。对于大文件来说,这也是一个很大的开销。你是对的,我没有想到换行。我已经添加了一个问题/测试来解决这个问题:我不认为这个实现“有很多开销”,除非您提到的“大文件”有很长的行。正如您所说,它逐行迭代,只跟踪当前行和当前文件位置。我知道这不是一个优化的解决方案,但它应该适用于坚持文件位置很重要的一般用途。