2012-07-16 80 views
1

如果這是一個愚蠢的問題,請隨時騷擾我,因爲我自己找不到正確的答案。我正在嘗試讀取包含每行數據的CSV格式的文件,並且每行都以逗號結尾。就像這樣:Python CSV:以逗號結尾的行讀取結果爲空結果

-1, 
-1, 
1, 
1, 

當我嘗試使用Python的CSV功能,我用這個代碼:

with open(waveform, 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     print row 

,它輸出以下內容:

['-1', ''] 
['-1', ''] 
['1', ''] 
['1', ''] 

我希望它忽略每行都有空的字符。你有什麼建議嗎?

+0

如果你的文件確實只是一個只有每一個值逗號終止行列表行(並沒有真正的任何值*分隔*逗號),在我看來,它不是真正的CSV,你不應該使用'csv'模塊... – geoffspear 2012-07-16 12:08:58

+1

@Wooble:它*是*有效的,和CSV模塊正在做正確的事情 - 每行包含兩個元素,其中一個是空字符串。即使沒有逗號,它也是一個有效的CSV文件(只有一個只有一列)。 – 2012-07-16 12:11:14

+0

@TimPietzcker,儘管技術上有效的CSV確實如此,但沒有理由使用CSV模塊從行中讀取單個值,而根本不需要導入就可以讀取單個值。 – geoffspear 2012-07-16 12:12:22

回答

5

忽略每行的最後一個元素:

with open(waveform, 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     print row[:-1] 

或每一行轉換成一個字典:

columns = ['value'] 
with open(waveform, 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     rec = dict(zip(columns, row)) 
     print rec 

打印

{'value': '-1'} 
{'value': '-1'} 
{'value': '1'} 
{'value': '1'} 
+0

是的,這解決了這個問題。不過,如果可能的話,我希望在閱讀CSV文件時從一開始就消除此問題。 – veor 2012-07-16 11:51:47

+0

@ user1498553 - 'csv.reader'獨立工作,並且返回行內的所有元素,而不管其數量。所以你必須獨立處理每條線。 – eumiro 2012-07-16 11:53:21

2

我與@ eumiro的答案去。

csv.reader中有一個lineterminator=選項,但顯然現在忽略了......所以這是一個不行。

如果不得不csv.reader沒有看到尾隨字段分隔符,然後寫一個過濾器:

def remove_last_char(fileobj): 
    for line in fileobj: 
     yield line.strip()[:-1] 

with open(waveform, 'rb') as f: 
    reader = csv.reader(remove_last_char(f)) 
    for row in reader: 
     print row[:-1]