2013-03-07 34 views
3

我是编程新手,在某些课程中遇到了一些问题,我无法理解。考虑一个名为'example.csv'的假想文件,其中包含以下内容。为什么Python 2.7.3会将我的.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认为整个文件全部放在一行上。有没有人对此有所了解?

+0

它并不认为它是全部在一个实况上,你的行尾是'\ r \ n'而不是'\ n'。 – Joe 2013-03-07 01:44:54

+0

不,他的行尾是''\ r''。为什么要这样呢? @Jeremy,你在用什么操作系统?什么程序创建了CSV文件? – 2013-03-07 01:45:24

+0

我的猜测仍然是'\ r \ n',因为在第一个输出示例中,它显示空格和'\ n'丢失。尝试使用open(“example.csv”,“rU”)' – Joe 2013-03-07 01:49:36

回答

7

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

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

(请注意,某些Mac的文本编辑器仍然使用\r作为行终止,但这些都是值得庆幸的是常见的少得多,现在比几年前是。)

+0

+1,谢谢!我不知道'U''。 – 2013-03-07 02:22:32

+0

这非常有帮助,'RU'模式工作得很好。谢谢! – 2013-03-07 03:09:24

3

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

在你的文件中,行之间用'\r'分开,任何都不是标准的现代操作系统。也许创建该文件的程序在某种程度上存在缺陷。

+0

正如我在这个问题的评论中提到的,罪魁祸首是Excel for Mac 2011.感谢您的帮助。 – 2013-03-07 03:13:20

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声明听到会在您退出语句块时自动关闭该文件。

+0

的确如此,但它并没有回答他的问题,也没有解决他的问题。他*仍然*需要用“U”打开。也许你的回答会更好,作为评论。 – 2013-03-07 02:48:37

+0

是的,我同意,但它不会格式良好的评论。 – monkut 2013-03-07 02:52:46

相关问题