2013-02-23 43 views
1

我有一批50-60 csv文件,無論出於何種原因,每個文件的前四行都有垃圾數據。然而,在垃圾數據之後,列標題被正確列出,並且文件的其餘部分都很好。我怎麼能去除這些python中前四個文件的每個文件?這裏是我的代碼至今:去掉Python中前四行的Python?

import csv 
total = open('C:\\Csv\\201.csv', 'rb') 
for row in csv.reader(total): 
    print row 

正如你所看到的,我做的是打開的文件和打印其內容。我已經搜索了刪除csv文件的某些方面的解決方案,但是大多數刪除整個列,或者取決於要刪除的行的特定條件。就我而言,這僅僅是一個順序問題,每個文件都需要被剝離其前四行。任何和所有的幫助,不勝感激。

回答

3
for i, line in enumerate(sys.stdin, -4): 
    if i>=0: print line, 
+0

當。簡潔的代碼。完美的作品。謝謝! – user1067257 2013-02-23 19:47:37

4

你可以這樣做:

reader = csv.reader(total) 
all(next(reader) for i in range(4)) 

for i in range(4): next(reader) 
+0

這很有創意。我從未想過要使用「任何」。 – user1067257 2013-02-23 19:56:44

+3

'any'只跳過第一行,'all'跳過所有四行。 – 2013-02-23 20:52:31

+0

@HaiVu:當然!我想我需要多加關注。 – 2013-02-23 22:54:45

0

你可以寫一個通用的函數來跳過任何序列的前n項:

def skip_first(seq, n): 
    for i,item in enumerate(seq): 
     if i >= n: 
      yield item 

要使用它:

import csv 
with open('C:\\Csv\\201.csv', 'rb') as total: 
    csvreader = csv.reader(total) 
    for row in skip_first(csvreader, 4): 
     print row 

此功能是通用的,因爲它可以跳過任何序列,而不僅僅是文件:

# Skip the first three 
list = ['happy', 'grumpy', 'doc', 'sleepy', 'bashful', 'sneezy', 'dopey'] 
for item in skip_first(list, 3): 
    print item 
0

我很驚訝,沒有人建議用islice這裏的Python的方式...

from itertools import islice 
with open('somefile') as fin: 
    csvin = islice(csv.reader(fin), 4, None, None) 
    for row in csvin: 
     pass 

例如:

>>> r = range(10); list(islice(r, 4, None, None)) 
[4, 5, 6, 7, 8, 9] 
0

ñ其中一個答案似乎需要考慮DictReader所需的標題行:除非第一行包含字段列表以外的任何內容,否則DictReader將不會識別它們並正確解析。

而且因爲csv.reader需要類似文件的對象,所以我不得不使用StringIO作爲臨時緩衝區(不是一個嚴重的問題,我通常有大約20行)。

with StringIO() as csvio: 
    for i, line in enumerate(myfile.iter_lines()): 
     if i < 5: 
      continue 
     else: 
      csvio.write(line) 

    reader = csv.DictReader(csvio) 

將不勝感激更好的建議如何,如果所有在內存中創建的除前N的所有行類似文件的對象,而不緩衝。