2012-03-15 54 views
2

我使用csv Python包閱讀這樣一個CSV文件:python中是否有強類型的csv閱讀器?

r = csv.DictReader(open(r'd:\aaa.csv', 'rb')) 
for row in r: 
    print row 

的問題是,在產生的字典中的所有值都是字符串,我需要他們轉換爲相應的類型。我有一個列名稱和類型之間的映射。

這裏有沒有捷徑,還是我必須自己做這一切?

編輯

我已經標記爲https://stackoverflow.com/a/9720733/80002答案。只是,我稍微修改了它。沒有一點用DictReader如果我要去反正進行後處理,所以這是我的斯文的代碼的修改:

r = csv.reader(open(r'd:\aaa.csv', 'rb')) 
header = r.next() 
converters = [converters_map[c] for c in header] 
for row in r: 
    row = {title:converter(value) for title, converter, value in zip(header, converters, row)} 
    print row 
+0

如果你最終編寫一個包裝'csv'的庫來做到這一點,我相信其他人也會從中受益。這就是說,它不應該那麼難。 – 2012-03-15 13:04:37

+2

不完全是你所要求的,但相關:使用['quoting = csv.QUOTE_NONNUMERIC'](http://docs.python.org/library/csv.html#csv.QUOTE_NONNUMERIC)將未加引號的字段轉換爲'float'。 – 2012-03-15 13:07:54

+0

我不知道任何準備好這樣使用的東西。所以我會自己寫映射閱讀器。如果你看一下'DictReader'的源代碼,它非常簡單(它甚至不會繼承任何東西)。 – 2012-03-15 13:09:19

回答

4

如果你有轉換器功能將字符串轉換爲相應的類型,那麼所有的字典你需要的是

with open("d:/aaa.csv", "rb") as input_file: 
    reader = csv.DictReader(input_file) 
    for row in reader: 
     row = {k: converters[k](v) for k, v in row.items()} 
     print row 

(Python 2.7版。對於早期版本使用dict(),而不是字典解析。)

您可以在發電機的功能包裝代碼(只需使用yield row而不是print row)。

+0

我編輯了我的問題。您似乎是一位經驗豐富的Python開發人員,您認爲像我在修改後的答案中那樣使用'reader'和'zip'三個集合更高效嗎? – mark 2012-03-15 15:04:12

+0

@mark:我認爲你的方法非常好,而且它的效率肯定不低於這個答案中的代碼。我期望這個任務對於大文件是I/O綁定的,所以可能你的代碼也不是更高效。和往常一樣,如果你想得到一個明確的答案,你必須測量自己(但是如果你這樣做,注意緩存引入的偏見)。儘管如此,我看不出任何理由*不*使用您的修改方法。 – 2012-03-15 15:35:52