我有一個包含以下資料的 csv 檔案:
name, postcode, meals
John, 27133, breakfast
Mary, 90356, lunch, supper
David, 95221, breakfast, lunch, supper
我如何將每一行作為字典讀取,最后一個欄位是一個串列:
d_john = {
'name': 'John',
'postcode': 27133,
'meals': ['breakfast']
}
d_mary = {
'name': 'Mary',
'postcode': 90356,
'meals': ['lunch', 'supper'],
}
d_david = {
'name': 'David',
'postcode': 95221,
'meals': ['breakfast', 'lunch', 'supper']
}
uj5u.com熱心網友回復:
用:
# change data.csv to your file_path
with open("data.csv") as infile:
next(infile) # skip header
for line in infile:
name, postcode, *meals = line.strip().split(", ")
print({"name": name, "postcode": postcode, "meals": meals})
輸出
{'name': 'John', 'postcode': '27133', 'meals': ['breakfast']}
{'name': 'Mary', 'postcode': '90356', 'meals': ['lunch', 'supper']}
{'name': 'David', 'postcode': '95221', 'meals': ['breakfast', 'lunch', 'supper']}
該函式next將迭代器移動一行,有效地跳過標題。然后使用擴展迭代解包讀取檔案中的每個值,split用于拆分后。
更好的選擇可能是使用csv.DictReader:
import csv
# change data.csv to your file_path
with open("data.csv") as infile:
reader = csv.DictReader(infile, fieldnames=["name", "postcode"], restkey="meals", skipinitialspace=True)
next(reader)
for row in reader:
print(dict(row))
輸出
{'name': 'John', 'postcode': '27133', 'meals': ['breakfast']}
{'name': 'Mary', 'postcode': '90356', 'meals': ['lunch', 'supper']}
{'name': 'David', 'postcode': '95221', 'meals': ['breakfast', 'lunch', 'supper']}
從檔案(強調我的):
的欄位名的引數是一個序列。如果省略fieldnames,則檔案f 第一行中的值將用作fieldnames。不管如何確定欄位名,字典都會保留它們的原始順序。
如果一行的欄位數多于欄位名,則剩余的資料將放入一個串列中,并使用restkey指定的欄位名(默認為 None)存盤。
, 的解釋skipinitialspace=True可以在方言和格式引數部分找到,參考完整性:
當為 True 時,緊跟在分隔符之后的空格將被忽略。默認值為假。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342620.html
