如何使用Python在csv DictReader中排除列?

时间:2018-10-08 11:54:54

标签: python-3.x csv dictionary

我真的很想阅读以下csv文件: ID;名字;姓;电话; 123;最大值史密斯0193849843 124;约翰;母鹿; 0012943843

..并将其提取为以下格式:

[OrderedDict([('ID','123'),('Last Name','Smith')])),OrderedDict([('ID','124'),(“ Last Name”,“ Doe“)])]

但是,在下面显示我的代码的情况下,im只能使用其中的所有键来获取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) 

非常感谢! 乔纳斯(Jonas)

2 个答案:

答案 0 :(得分:0)

简短的回答是,您可以阅读特定的列(但要注意)。 但是,如果您仅阅读所有列,然后根据所需的列构建字典,它将变得更加简单。它简单得多,甚至可能表现更好。


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

来自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')])]

答案 1 :(得分:0)

我更新了我的代码,但是仍然存在以下结果的问题:

[OrderedDict([('ID', '123'), ('Last Name', 'Max')]), 
 OrderedDict([('ID', '124'), ('Last Name', 'John')])]

即使该代码应该跳过并从3号列获取值,该代码仍在从2号列获取值。 输入格式看起来像是从Excel创建的普通csv文件:

 ID; First Name; Last Name; Phone
 123; Max; Smith; 0193849843 
 124; John; Doe; 0012943843

我的代码:

import csv,json

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

data = []

with open(csvfilepath) as csvfile:
    csvReader = csv.DictReader(csvfile,delimiter=";",fieldnames=["ID", "Last Name"])

    for csvRow in csvReader:
        ID = csvRow["ID"]
        csvRow["ID"] = csvRow["ID"] 
        csvRow["Last Name"] = csvRow["Last Name"]

        if csvRow["ID"] == "ID":
            continue
        else:
            data.append(csvRow)

data1 = list(data)
for row in data1:
    row.pop(None)

print(data1)

#[OrderedDict([('ID', '123'), ('Last Name', 'Max')]), 
# OrderedDict([('ID', '124'), ('Last Name', 'John')])]

再次感谢, 乔纳斯(Jonas)