为什么Python 2.7.3认为我的.csv文档都在一行?

时间:2013-03-07 01:41:59

标签: python python-2.7 csv for-loop line-endings

我是编程的新手,在我的一些课程中遇到了一个我无法理解的问题。考虑一个名为'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认为整个文件首先都在一行上。有没有人对此有所了解?

3 个答案:

答案 0 :(得分:7)

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

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

(请注意,有些Mac文本编辑器仍然使用\r作为行终止符,但幸运的是,现在它们比几年前更不常见。)

答案 1 :(得分:3)

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

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

答案 2 :(得分: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语句将自动为您关闭文件。