Find number of lines in csv without reading it
是否有一种方法可以在不将整个文件实际加载到内存(在python中)的情况下查找csv文件中的行数?
我希望它能有一些特殊的优化功能。我现在能想象的就是一行一行地读它,数数行数,但这有点扼杀了它所有可能的意义,因为我只需要行数,而不需要实际的内容。
- 我想不会。csv不会在文件的页眉或页脚中存储任何元信息。因此,获取行的数量需要读取整个文件。由于这通常是通过读取最多
或(取决于编码)的行来实现的,这意味着没有更快的方法可以做到这一点。不过,读取文件字符(而不是行)并只计算换行数可能会更快。
- 不用看就可以确定牛的颜色
- 副本有一些很好的答案。我投票决定关闭它…或者我应该删除这个问题?
- @我可以通过查看农场的奶牛数据库来确定奶牛的颜色,而不需要去农场并使用分光计。
- @萨什基洛准确地说。你有农场的csv文件数据库吗?
- @我只是反驳你的说法。我不知道是否有其他的工具可以加快速度,这就是我为什么要问的。不明显,我就是这么说的。
- @萨什基洛:在不同的背景下,你为什么想知道?也许你在解决错误的问题?
- @Abhijit好吧,这对我来说不是一个关键的问题,只是一个方便的问题:我有一些脚本定期处理一些大型文件,我想知道其中有多少行,以便我知道还有多少行需要处理。我现在认为你可以通过计算处理的兆字节数来完成,而不是用实际的行来完成…我不希望此功能成为内存或性能问题。
- @萨什基洛:在这种情况下,你不需要一个确切的值,我建议你得到一个估计。可能只是通过读取整个文件中的一部分行并计算平均值。这将给您一个平均行大小,然后简单地将文件大小除以平均行大小。
- 是的,这是个好主意(根据@fabrizimo的回答)。
- @塞缪尔-计算换行符不适用于csv文件,因为它们可以出现在单元格值中。一般来说,计算csv文件的行数不是获得行数的可靠方法。
- @mouviciel-或者是分隔符的数目。或者,如果行数不要求精确:根据文件大小和平均行宽猜测(均匀分布?)n—文件中的样本集。
您不需要将整个文件加载到内存中,因为文件的行是可重写的:
1 2 3 4
| with open(path) as fp:
count = 0
for _ in fp:
count += 1 |
或者,更惯用一点:
1 2 3
| with open(path) as fp:
for (count, _) in enumerate(fp, 1):
pass |
- 读取内存中的整个文件(不存储文件,但读取文件)
- @Fabrizimo"读取",是,但不是"加载"
- 好吧,您仍然需要将整个文件读取到内存中,您不必一次将其完全保存在内存中,您可以遍历块。
- 不管你对"负荷"这个词有什么奇怪的定义。这肯定会从磁盘读取整个文件。
- @Aychedee"从磁盘读取整个文件"——是的,"将整个文件加载到内存"——不是的。从讨论中我们可以看到,这就是OP所要求的。
是的,在知道文件中有多少行之前,您需要在内存中读取整个文件。只需将文件看作一个长字符串aaaaabbbbbbcccccccddddddeeeee即可知道字符串中有多少"行",您需要找到其中有多少个字符。
如果你想要一个大概的数字,你可以读几行(~20行),看看每行有多少个字符,然后从文件的大小(存储在文件描述符中)得到一个可能的估计值。