python中CSV文件的行数错误

Posted

技术标签:

【中文标题】python中CSV文件的行数错误【英文标题】:Wrong row count for CSV file in python 【发布时间】:2019-08-06 06:27:46 【问题描述】:

我正在处理一个 csv 文件,在此之前我使用以下代码获取行数。

total_rows=sum(1 for row in open(csv_file,"r",encoding="utf-8"))

代码是在link 中提供的帮助下编写的。 但是,total_rows 与 csv 文件中的实际行数不匹配。我找到了一种替代方法,但想知道为什么它不能正常工作??

在 CSV 文件中,有包含大量文本的单元格,我必须使用编码以避免读取 csv 文件时出错。

感谢任何帮助!

【问题讨论】:

当你有 具有大文本的单元格时,pandas.read_csv 等 csv 解析器将正确读取它,而不是 open 逐行读取文件,不考虑巨大的文字合而为一。 @Chris 是的。我找到了正确读取行的替代方法。但是上面建议用于计算行数的代码有什么问题? 正如我所说,假设您的 huge text 是两行或更多行。在 csv 中,这被视为 一个单元格,它将位于一行内。尽管如此,open 并不知道它应该被视为一个单元格,而是简单地返回行数。 你的文件有多少行?您确定没有\r\n 的混合可能会给您带来错误的计数吗?或某些单元格文本中的一些\n\r 我在一个大文件上运行了你的代码,它为我提供了正确的输出:python count_row.py 1715181568wc -l 的结果相同 【参考方案1】:

假设您有一个 csv 文件,其中某些单元格是多行文本。

$ cat example.csv
colA,colB
1,"Hi. This is Line 1.
And this is Line2"

从外观上看,它有三行,wc -l 同意:

$ wc -l example.csv
3 example.csv

opensum 也是如此:

sum(1 for row in open('./example.csv',"r",encoding="utf-8"))
# 3

但现在如果您阅读的是一些 csv 解析器,例如 pandas.read_csv:

import pandas as pd

df = pd.read_csv('./example.csv')
df
   colA                                    colB
0     1  Hi. This is Line 1.\nAnd this is Line2

另一种获取正确行数的方法如下:

with open(csv_file,"r",encoding="utf-8") as f:
     reader = csv.reader(f,delimiter = ",")
     data = list(reader)
     row_count = len(data)

不包括标题,csv 包含 1 行,我相信这是您所期望的。 这是因为colB 的第一个单元格(又名巨大的文本块)现在被正确处理,引号包裹了整个文本。

【讨论】:

【参考方案2】:

我认为这里的问题是因为您没有计算行数,而是计算换行符(Windows 中的 \r\n 或 linux 中的 \n)。问题在于,当您有一个包含换行符示例的文本单元格时:

1, "my huge text\n with many lines\n"
2, "other text"

当实际只有 2 行时,您的上述数据方法将返回 4

尝试使用 Pandas 或其他库来读取 CSV 文件。示例:

import pandas as pd
data = pd.read_csv(pathToCsv, sep=',', header=None);
number_of_rows = len(df.index) # or df[0].count()

请注意,len(df.index) 和 df[0].count() 不可互换,因为 count 不包括 NaN。

【讨论】:

我能够在不使用 pandas 的情况下获得正确的行数,但您是否建议 open 函数也计算每个单元格中的行数? 是的,因为 open 只是读取文件。没有考虑到这是 CSV。 克里斯总结了你所说的。谢谢。

以上是关于python中CSV文件的行数错误的主要内容,如果未能解决你的问题,请参考以下文章

csv 文件中的行数

csv 文件中的行数

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多

获取多个 CSV 文件的行数和列数

SSIS脚本任务获取csv文件的行数

使用 Dask 从 CSV 文件中采样确切的行数