dict.get返回空值而不是默认值

时间:2019-02-26 11:37:52

标签: python dictionary

我得到了一个CSV文件,其中包含行idnamefirstnamecompany

我正在使用csv.DictReader遍历CSV,并希望将一些默认值插入namefirstname中,如果它们为空

dict.get()应该可以解决问题-但是只有namefirstname 从不包含任何数据时,它才有效。一旦它们至少包含一次数据,将忽略返回的默认值,并且什么都不会返回

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

2 个答案:

答案 0 :(得分:3)

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会将另一个操作数生成为{ {1}}。

答案 1 :(得分:-1)

希望这可以帮助您完成此任务。

如果您不确定特定行中是否有值,请尝试此操作

if row.get("name") and row.get("name") != None:
    name = row['name']
else:
    name = row["company"] #default value