2012-10-17 113 views
3

是否有可能讀取CSV文件的頭部空白區分大小寫?至於現在我用csv.dictreader這樣的:讀取csv頭部空白區域和不區分大小寫

import csv 
csvDict = csv.DictReader(open('csv-file.csv', 'rU')) 

# determine column_A name 
if 'column_A' in csvDict.fieldnames: 
    column_A = 'column_A' 
elif ' column_A' in csvDict.fieldnames: 
    # extra space 
    column_A = ' column_A' 
elif 'Column_A' in csvDict.fieldnames: 
    # capital A 
    column_A = 'Column_A' 

# get column_A data 
for lineDict in csvDict: 
    print(lineDict[column_A]) 

正如你可以從代碼中看到,我的CSV文件有時額外的空格或大寫字母不同,例如

  • 「column_A」
  • 「column_A」
  • 「Column_A」
  • 「Column_A」
  • ...

我想用這樣的:

column_A = ' Column_A'.strip().lower() 
    print(lineDict[column_A]) 

任何想法?

+0

如果你也想訪問字典,自動帶()下()查詢,看看我的完整工作代碼示例http://stackoverflow.com/a/12970460/1251007 – user1251007

回答

5

如何覆蓋DictReader.fieldnames屬性?

class MyDictReader(DictReader): 

    @property 
    def fieldnames(self): 
     return [field.strip().lower() for field in super(MyDictReader, self).fieldnames] 
+0

如果您在Python 2中嘗試此操作,它將無法工作,因爲csv.DictReader是一種經典風格的類,您不能使用'super '在clas sic-style,http://stackoverflow.com/questions/9698614/super-raises-typeerror-must-be-type-not-classobj-for-new-style-class –

8

你可以重新定義reader.fieldnames

import csv 
import io 

content = '''column_A " column_B" 
1 2''' 
reader = csv.DictReader(io.BytesIO(content), delimiter = ' ') 
reader.fieldnames = [field.strip().lower() for field in reader.fieldnames] 
for line in reader: 
    print(line) 

產量

{'column_b': '2', 'column_a': '1'} 
+0

謝謝你的回答。我認爲你的代碼對於初學者更具可讀性/可用性。但是,我選擇了「Defuz」答案作爲正確的答案,因爲它更加pythonic,可以更容易地重用。 – user1251007