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

问题描述 投票:0回答:2

我有一个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
python dictionary
2个回答
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将生成or的另一个操作数。


-1
投票

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

如果你不确定特定行是否有值,那么试试这个,

if row.get("name") and row.get("name") != None:
    name = row['name']
else:
    name = row["company"] #default value
© www.soinside.com 2019 - 2024. All rights reserved.