2013-03-14 16 views
0

我正在尋找一種聰明的方式來檢查文件的第一行,然後將其作爲csv文件讀取。我想檢查是否有# coding: xxx行,以便我可以相應地解碼讀取數據。但是如果沒有這樣的行,第一行可能已經包含一個數據集。尋求對我來說似乎非常殘酷,我希望能夠做到這一點。在讀取CSV之前檢查文件第一行的整潔方法

import re 
import csv 
fl = open(filename) 
line = fl.readline() 
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line) 
fl.seek(0) 

reader = csv.reader(fl) 
# ... 
+0

什麼是「如此殘酷」尋求? – 2013-03-14 21:58:02

+0

@ThomasOrozco:這是另一個最終可以跳過的I/O調用。 – 2013-03-14 21:59:26

回答

3

我看不出有什麼毛病你目前的做法,但在這裏就是你會發現最好的選擇:它是不是從你的問題,或者您發佈的代碼清晰

import re 
import csv 
import itertools 

line = next(f1) 
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line) 
reader = csv.reader(itertools.chain([line], f1)) 

,但如果你不希望包括第一線,如果你的正則表達式匹配,你可以做到以下幾點:

reader = csv.reader(f1 if coding else itertools.chain([line], f1)) 
+0

這是一個很好的!我不知道我可以將任何迭代傳遞給'csv.reader'類。 – 2013-03-14 22:11:21

+2

一般來說,不要混合使用'.readline()'和迭代器訪問文件(由於緩衝可能會丟失數據)。改用'line = next(f1)'。 – jfs 2013-03-14 22:15:32

+0

謝謝,編輯了使用'next(f1)'代替的答案。 – 2013-03-14 22:31:20

0

會在第一行過這個樣子?

# coding: xxx, some other "field", and maybe another field 

如果沒有,你剛纔讀的第一線,尋找一個逗號,如果沒有逗號沒有發現試圖解釋一個編碼,否則它(和所有其他行)傳遞給csv.reader()