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

Posted

技术标签:

【中文标题】如何知道python中一行CSV文件的字节位置?【英文标题】:How to know the byte position of a row of a CSV file in python? 【发布时间】:2012-08-20 00:44:40 【问题描述】:

我正在处理巨大的 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

有什么建议吗?请指教。

【问题讨论】:

我怀疑 csv 不可能做到这一点。根据文件的结构,您可以只在分隔符上使用str.split 并使用常规文件对象... @mgilson 不幸的是,我不能使用 split,因为项目包含标准 CSV 分隔符:引号、换行符等。 【参考方案1】:

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

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

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

【讨论】:

这不起作用,因为项目包含标准 CSV 分隔符:引号、换行符等。我需要字节位置以通过 f.seek 快速访问 CSV 文件中的某些数据i> 而不是使用 csv 模块逐行读取。 我的意思是您可以以正常方式读取文件作为文本文件。如果这涉及使用seek() 而不是行迭代器习语,那很好。无论哪种情况,您仍然可以使用csv 模块来仅解析您需要解析的部分。 其实我得到了你。问题是每个部分都必须是有效的 CSV。我的意思是它不能在一列的行中间结束。当我发布问题时,我寻找了一个非常简单的解决方案并且不想编写额外的解析器等。【参考方案2】:

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

【讨论】:

【参考方案3】:

csv 模块确实使用预读缓冲区读取块,正如在回复这篇文章中所建议的那样:

file.tell() inconsistency

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

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

希望对你有帮助!

【讨论】:

csv-position-reader 依赖于 readline 最初逐行读取文件,然后实例化一个新的 csv reader 来解析每一行。如果数据包含换行符,这将失败。大文件的开销也很大。 你说得对,我没有考虑换行。我已经添加了一个问题/测试来解决这个问题:github.com/loisaidasam/csv-position-reader/issues/1 我不认为这个实现是“很多开销”,除非你提到的“大文件”有很长的行。正如您所说,它逐行迭代,仅跟踪当前行和当前文件位置。我知道这不是一个优化的解决方案,但它应该适用于持久文件位置很重要的一般用途。

以上是关于如何知道python中一行CSV文件的字节位置?的主要内容,如果未能解决你的问题,请参考以下文章

2018-01-06 python读取csv某一行

如何使用python访问csv文件中的每一列

如何在没有sed的情况下替换csv文件中的一行[重复]

c语言,关于读取csv文件的数据,(一行有四列)显示在屏幕。下面的代码:列数据

如何将vb中的数据写入csv文件?

如何将列表列表写入 CSV 文件 Python?