为啥 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 文件附加到一个空列表中 - 获取一个空列表