2015-07-20 162 views
1

我使用pythons csv閱讀器。我如何使用下面的代碼來忽略空白行。python csv閱讀器忽略空行

import csv 
f1 = open ("ted.csv") 
oldFile1 = csv.reader(f1, delimiter=',', quotechar='"') 
oldList1 = list(oldFile1) 
f2 = open ("ted2.csv") 
newFile2 = csv.reader(f2, delimiter=',', quotechar='"') 
newList2 = list(newFile2) 

f1.close() 
f2.close() 

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out: 
    r1, r2 = csv.reader(f1), csv.reader(f2) 
    st = set((row[0], row[3]) for row in r1) 
    wr = csv.writer(out) 
    for row in (row for row in r2 if (row[0],row[3]) not in st): 
      wr.writerow(row) 
+0

你的csv文件實際上是什麼樣子的?你能編輯幾行例子,包括空行嗎?另外,你得到的具體錯誤是什麼,Python是否會引發異常,或者你只是沒有得到你想要的結果? – Marius

+0

csv的第一行是空行。我得到的錯誤是IndexError:列表索引超出範圍。如果我手動刪除第一個空白行並運行,我沒有得到任何錯誤。 –

回答

1

如果您的CSV文件,開始以一個空行,我想你應該可以跳過該行以readline()創建CSV讀者面前:

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out: 
    f1.readline() 
    f2.readline() 
    r1, r2 = csv.reader(f1), csv.reader(f2) 
1

如果你的空白總是在第一那麼Marius的回答是最簡單的。如果您在開始處有空白,或者您只想跳過一些行數,則可以使用itertools.islice()

跳到第N行

假設你要跳過第一4行(空行或不):

from itertools import islice 
with open('csv2.csv', 'r') as f1, open('out.csv', 'w') as out: 
    filt_f1 = islice(f1, 4, None) 
    r1 = csv.reader(filt_f1) 
    wr = csv.writer(out) 
    for line in r1: 
     ... 

空白行整個

如果你有空白行散佈在整個文件中,然後您可以使用itertools.filterfalse將其過濾掉。

import csv 
from itertools import filterfalse 
from itertools import chain 

with open('csv1.csv', 'r') as f1, open('csv2.csv', 'r') as f2, open('out.csv', 'w') as out: 
    # create an iterator without lines that start with '\n' 
    filt_f1 = filterfalse(lambda line: line.startswith('\n'), f1) 
    filt_f2 = filterfalse(lambda line: line.startswith('\n'), f2) 

    # csv.reader consumes the filtered iterators 
    r1, r2 = csv.reader(filt_f1), csv.reader(filt_f2) 
    wr = csv.writer(out) 

    # here insert your logic, I just write both to the same file 
    for line in chain(r1, r2): 
     wr.writerow(line) 

其中csv1.csv是:

time,name,location 
12345,Jean,Montreal 

12346,Peter,Chicago 

1234589,Doug,Boston 

和csv2.csv(:這裏沒有顯示,但在文件的頂部csv2.csv有4個空行):

123457,Scott,San Diego 

123458,Jen,Miami 

123459,Robert,Sacramento 

輸出out.csv沒有空行遍佈:

time,name,location 
12345,Jean,Montreal 
12346,Peter,Chicago 
1234589,Doug,Boston 
123457,Scott,San Diego 
123458,Jen,Miami 
123459,Robert,Sacramento