我有一个CSV文件,其中包含行id
,name
,firstname
和company
我正在使用csv.DictReader
循环CSV,并希望在name
和firstname
中插入一些默认值,如果它们是空的
dict.get()
应该做的 - 但它只有在name
和firstname
从不包含任何数据时才有效。只要它们至少包含一次数据,就会省略返回的默认值,并且不会返回任何内容
"id","name","firstname","company"
"1","doe","john","jdoe inc"
"2","doe","jane","jdoe inc"
"3",,,"company inc"
import csv
with open("test.csv") as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
firstname = row.get("firstname", "Company")
name = row.get("name", row["company"])
company = row["company"]
print(f"Firstname: {firstname}")
print(f"Name: {name}")
print(f"Company: {company}\n")
上述测试脚本的输出是
Firstname: john
Name: doe
Company: jdoe inc
Firstname: jane
Name: doe
Company: jdoe inc
Firstname:
Name:
Company: company inc
我想要的输出是
Firstname: john
Name: doe
Company: jdoe inc
Firstname: jane
Name: doe
Company: jdoe inc
Firstname: Company # <- default value of dict.get()
Name: company inc # <- default value of dict.get()
Company: company inc
仅当未设置密钥时,dict.get()
才会返回默认值。但DictReader()
正在设置键,空字符串作为值。那是因为该列中有一个空字符串。
事实上,DictReader()
保证每个字段名称都有一个键集(字段名称取自第一行);如果完全缺少列,则将值设置为None
。
你可以通过使用or
来平凡地解释这个问题:
firstname = row["firstname"] or "Company"
name = row["name"] or row["company"]
如果密钥总是在那里,使用dict.get()
是没有意义的。但是如果row["firstname"]
被设置为空字符串或None
,那么这是一个considered false的值,因此Python将生成or
的另一个操作数。
希望这可以帮助您完成此任务..
如果你不确定特定行是否有值,那么试试这个,
if row.get("name") and row.get("name") != None:
name = row['name']
else:
name = row["company"] #default value