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

Raz*_*fen 2 python dictionary

我得到了一个 CSV 文件,其中包含行id、name和firstnamecompany

我正在循环 CSV 并csv.DictReader希望将一些默认值插入其中,name如果firstname它们为空

dict.get()应该可以解决问题 - 但它仅在name且不包含任何数据firstname 时才有效。一旦它们至少包含一次数据,返回的默认值将被忽略,并且不会返回任何内容

测试.csv

"id","name","firstname","company"
"1","doe","john","jdoe inc"
"2","doe","jane","jdoe inc"
"3",,,"company inc"
Run Code Online (Sandbox Code Playgroud)

导入_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")
Run Code Online (Sandbox Code Playgroud)

上述测试脚本的输出是

Firstname:  john
Name:       doe
Company:    jdoe inc

Firstname:  jane
Name:       doe
Company:    jdoe inc

Firstname:
Name:
Company:    company inc
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

dict.get()仅当未设置该键时才返回默认值。而是DictReader()设置键,以空字符串作为值。那是因为该列中有一个空字符串。

事实上,DictReader()保证每个字段名称都有一个键集(其中字段名称取自此处的第一行);如果完全缺少一列,则该值设置为None。

您可以使用以下方法简单地解释这一点or:

firstname = row["firstname"] or "Company"
name = row["name"] or row["company"]
Run Code Online (Sandbox Code Playgroud)

dict.get()如果钥匙始终存在,那么使用就没有意义。但如果row["firstname"]设置为空字符串或 None,则该值被视为 false,因此 Python 将生成另一个操作数or。