我得到了一个包含行id
,name
,firstname
和company
我正在使用csv.DictReader
在CSV上循环,并想将一些默认值插入name
和firstname
(如果它们为空)
dict.get()
应该执行技巧 - 但是,仅当name
和firstname
从不包含任何数据时,它才能起作用。一旦它们至少包含一次数据,就会省略返回的默认值,并且 nothing 将返回
test.csv
"id","name","firstname","company"
"1","doe","john","jdoe inc"
"2","doe","jane","jdoe inc"
"3",,,"company inc"
import_csv.py
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
,那么这是一个被认为是false的值,因此python将将另一个操作数生成 or
。