为啥 Python 2.7.3 认为我的 .csv 文档都在一行上?

Posted

技术标签:

【中文标题】为啥 Python 2.7.3 认为我的 .csv 文档都在一行上?【英文标题】:Why does Python 2.7.3 think my .csv document is all on one line?为什么 Python 2.7.3 认为我的 .csv 文档都在一行上? 【发布时间】:2013-02-22 01:59:09 【问题描述】:

我是编程新手,在我的一些课程作业中遇到了一个我无法理解的问题。考虑一个名为“example.csv”的虚构文件,其内容如下。

Key1,Value1
Key2,Value2
Key3,Value3
...

如果我运行以下代码,它会打印文件中的每一行,然后在最后一行打印一个星号。我希望它打印由星号分隔的每一行。

infile = open("example.csv", "r")
for line in infile:
    print line.strip()
    print '*'
    #row_elements = line.split(",")
    #print row_elements

此外,如果我尝试通过删除上述代码中的哈希来分割每个逗号处的行,我会得到以下输出。

['Key1', 'Value1\rKey2', 'Value2\rKey3'...

通过将 "\r" 传递给 .split() 方法,输出略有改善。

['Key1,Value1', 'Key2,Value2'...

我仍然不明白为什么 python 一开始就认为整个文件都在一行上。有人对此有深入了解吗?

【问题讨论】:

它不认为它是all on one live,你的行尾是\r\n而不是\n 不,他的行尾是'\r'。为什么会这样? @Jeremy,您使用的是什么操作系统?什么程序创建了 CSV 文件? 我的猜测仍然是\r\n,因为在第一个输出示例中,它似乎缺少空格和\n。尝试使用open("example.csv", "rU") 以通用模式打开文件 Rob,我正在运行 mac OS X 10.5,但我认为在 Excel 中编辑 csv 文件后出现了问题。我尝试使用未经编辑的文件版本运行程序,它按预期工作。所以,我会说 Excel 在我保存时重新格式化了它。 【参考方案1】:

如果您正在处理 csv,您应该使用 csv 模块,它会处理处理 csv 输入/输出所涉及的大部分废话。

import csv
with open("example.csv", "rb") as infile:
    reader = csv.reader(infile)
    for row in reader:
        print row # a list of items in your file

当您退出语句块时,with 语句会自动为您关闭文件。

【讨论】:

没错,但它并没有回答他的问题,也没有解决他的问题。他仍然需要使用"U" 打开。也许您的回答作为评论会更好。【参考方案2】:

您的文件使用\r 作为行分隔符(也称为“CR”或“Classic Mac”换行约定)。 Python 的open 默认不处理这个问题。

您可以使用“通用换行符”模式(open 中的'rU' 模式)正确打开文件。

(请注意,一些 Mac 文本编辑器仍然使用 \r 作为行终止符,但幸运的是,这些现在比几年前少了很多。)

【讨论】:

这很有帮助,'rU' 模式工作得很好。谢谢!【参考方案3】:

您的输入文件格式不正确。在 Linux 上,行由'\n' 分隔。在 Windows 上,行由 '\r\n' 分隔,但运行时库中的代码使 '\r' 消失。

在您的文件中,行由'\r' 分隔,这不是任何现代操作系统的标准。也许创建该文件的程序在某些方面存在缺陷。

【讨论】:

正如我在问题的 cmets 中提到的,罪魁祸首是 Excel for Mac 2011。感谢您的帮助。

以上是关于为啥 Python 2.7.3 认为我的 .csv 文档都在一行上?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 2.7.3 中将 csv 文件附加到一个空列表中 - 获取一个空列表

通过 python 将 txt 转换为 CSV:为啥会出现额外的空行? [复制]

为啥我的列表没有加入当我尝试追加它们 Python

为啥 concat 重新格式化我的标题?

为啥在读取数据框时我的列名中出现 X.?

Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?