2013-03-07 55 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

相關問題