【问题标题】:How to exclude columns within csv DictReader using Python?如何使用 Python 排除 csv DictReader 中的列?
【发布时间】:2018-10-08 11:54:53
【问题描述】:

我真的很想阅读以下 csv 文件: ID;名;姓;电话; 123;最大限度;史密斯; 0193849843 124;约翰;美国能源部; 0012943843

..并解压成以下格式:

[OrderedDict([('ID', '123'), ('Last Name', 'Smith')]), OrderedDict([('ID', '124'), ("Last Name", "能源部")])]

但是,下面显示了我的代码,我只能获取带有所有键的 OrderedDict。怎么可能只访问 csv 文件中的某些列? 我需要确切的输出以便稍后将代码转换为 JSON。

import csv

csvfilepath = r"csvpath"
jsonfilepath = r"jsonpath"

data = []

with open(csvfilepath) as csvfile:
    csvReader = csv.DictReader(csvfile,delimiter=";")

    for csvRow in csvReader:
        ID = csvRow["ID"]
        data.append(csvRow) 

非常感谢! 乔纳斯

【问题讨论】:

    标签: python-3.x csv dictionary


    【解决方案1】:

    简短的回答是是的,您可以阅读特定的列(但需要注意)。 但是,如果您只是阅读所有列,然后从您需要的列中构建一个字典,它会简单得多。它更简单,甚至可能表现更好。


    您可以使用fieldnames 参数来明确定义您感兴趣的列。需要注意的是,其他列仍将出现在字典中None 键下(除非您使用@987654324 提供另一个键@参数)。

    来自docs

    fieldnames 参数是一个序列。如果省略fieldnames,则 文件 f 第一行中的值将用作fieldnames。 不管fieldnames 是如何确定的,有序的 字典保留其原始顺序。

    如果一行的字段多于fieldnames,则将剩余数据放入 一个列表并使用restkey 指定的字段名存储(其中 默认为无)。如果非空行的字段少于 fieldnames,缺失值用None填充。

    您可以使用fieldnames 指定所需的列,然后使用.pop 删除None 键(及其值)。

    考虑以下文件:

    header1,header2
    a,b
    c,d
    e,f
    

    然后:

    with open('test.csv') as csvfile:
        csvReader = csv.DictReader(csvfile, fieldnames=['header1'])
        print([row for row in csvReader])
        # [OrderedDict([('header1', 'header1'), (None, ['header2'])]),
        #  OrderedDict([('header1', 'a'), (None, ['b'])]),
        #  OrderedDict([('header1', 'c'), (None, ['d'])]), 
        #  OrderedDict([('header1', 'e'), (None, ['f'])])]
    

    如果我们弹出None 键:

    csvReader = list(csvReader)
    [row.pop(None) for row in csvReader]
    # yes, abusing list comprehension for a side effect for sake of a simple example.
    # Don't do that in production code
    print([row for row in csvReader])
    # [OrderedDict([('header1', 'header1')]), OrderedDict([('header1', 'a')]),
    #  OrderedDict([('header1', 'c')]), OrderedDict([('header1', 'e')])]
    

    【讨论】:

    • 您好,谢谢您的回答。唯一的事情是当我选择“ID”和“姓氏”列时,我的字典看起来如下。如您所见,姓氏不匹配。你知道为什么吗?另外,有没有办法排除只包含标题的字典的第一部分?输出:[OrderedDict([('ID', 'ID'), ('Last Name', 'First Name')]), OrderedDict([('ID', '123'), ('Last Name', ' Max')]), OrderedDict([('ID', '124'), ('Last Name', 'John')])]。再次感谢!
    • @J.Weiser 这与您尝试读取的 csv 文件的格式有关,而不是代码
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多