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 1715181568
与wc -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
open
和 sum
也是如此:
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文件的行数错误的主要内容,如果未能解决你的问题,请参考以下文章