2017-06-16 65 views
0

我有一個以逗號分隔的文件(來自第三方),其中每行以空格開頭和結尾,字段用雙引號引起來,文件以僅包含一行的結尾空間。以前導空格開始讀取csv

"first_name";"last_name" 
"John";"Doe" 
"Anita";"Doe" 

我試着用下面的代碼閱讀它。

import csv 
import json 

def read_csv(filename): 
    result = [] 
    with open(filename, 'r', encoding='utf-8') as f: 
     csv_reader = csv.reader(f, delimiter=';', quotechar='"') 
     for line_index, line in enumerate(csv_reader): 
      if line_index == 0: 
       header = line 
       continue 
      result.append(dict(zip(header, line))) 
    return result 

if __name__ == '__main__': 
    contents = read_csv('test.txt') 
    print(json.dumps(contents, indent=4, sort_keys=4)) 

這是我期望的結果:

[ 
    { 
     "first_name": "John", 
     "last_name ": "Doe " 
    }, 
    { 
     "first_name": "Anita", 
     "last_name ": "Doe " 
    } 
] 

然而,它始終把雙引號作爲第一列的一部分,由於前導空格,再加上它採取最後一行也考慮在內。這是結果我得到:

[ 
    { 
     " \"first_name\"": " \"John\"", 
     "last_name ": "Doe " 
    }, 
    { 
     " \"first_name\"": " \"Anita\"", 
     "last_name ": "Doe " 
    }, 
    { 
     " \"first_name\"": " " 
    } 
] 

如何才能擺脫前的CSV解析這些開頭和結尾的空格的?答案here顯示了在讀取字段後如何從字段中刪除空格,但這在這裏不太好,因爲它不是我想要更改的字段的內容,而是字段本身。

順便說一句:我正在使用Python 3.5。

編輯

我跳過空行現在使用下面的代碼:

# Skip empty lines 
line = [column.strip() for column in line] 
if not any(line): 
    continue 

回答

1

您可以使用skipinitialspace=True並使用csv.DictReader(假定第一行是標題,並創建一個dict爲您的名稱 - >價值,而不是手動自己做),而不是,例如:

with open(filename) as fin: 
    csvin = csv.DictReader(fin, delimiter=';', skipinitialspace=True) 
    result = list(csvin) 

或者,如果只與某些值的行應考慮(即最後一排,沒有價值,甚至iterim空白行應該被過濾掉),你可以使用:

result = [row for row in csvin if any(row.values())] 

Which'll給你:

[{'first_name': 'John', 'last_name ': 'Doe '}, 
{'first_name': 'Anita', 'last_name ': 'Doe '}] 

而且使用json.dumps(result, indent=4, sort_keys=4))的結果是:

[ 
    { 
     "first_name": "John", 
     "last_name ": "Doe " 
    }, 
    { 
     "first_name": "Anita", 
     "last_name ": "Doe " 
    } 
] 
+0

謝謝,這已經與領域內的雙引號幫助。儘管如此,它仍然給了我第三個元素,它帶有'first_name =「」'和'last_name = None'。 – physicalattraction

+0

@physicalattraction無法重現與您的示例數據...... –

+0

這可能是因爲SO刪除了我的CSV樣本的最後一行,除了空格,這是空的。 – physicalattraction