我真的很想阅读以下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)
答案 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)