将csv行迭代分配给字典值的更具Python风格的方法?
我有一个CSV文件,其中的列包含我读入字典中特定位置的特定值,行和数据的独立实例相当于一个完整的字典。在进入下一行之前,我读入并使用这些数据计算每一行的某些值、处理一些输入等。我的问题是,如果我有一个标题详细说明了列的名称(键1和键3A,等等),我是否可以使用该信息来避免我当前使用的代码(如下所示) 是的,你可以将csv行迭代分配给字典值的更具Python风格的方法?,python,csv,dictionary,Python,Csv,Dictionary,我有一个CSV文件,其中的列包含我读入字典中特定位置的特定值,行和数据的独立实例相当于一个完整的字典。在进入下一行之前,我读入并使用这些数据计算每一行的某些值、处理一些输入等。我的问题是,如果我有一个标题详细说明了列的名称(键1和键3A,等等),我是否可以使用该信息来避免我当前使用的代码(如下所示) 是的,你可以 import csv with open(infile, 'rU') as infile: reader = csv.DictReader(infile) for
import csv
with open(infile, 'rU') as infile:
reader = csv.DictReader(infile)
for row in reader:
print(row)
是的,你可以
import csv
with open(infile, 'rU') as infile:
reader = csv.DictReader(infile)
for row in reader:
print(row)
看看这段代码
fields = csv_data.next()
for row in csv_data:
parsed_data.append(dict(zip(fields,row)))
看看这段代码
fields = csv_data.next()
for row in csv_data:
parsed_data.append(dict(zip(fields,row)))
如果使用
读写器
,您可以稍微改进代码:
创建一个像普通读取器一样运行的对象,但映射
读入dict的信息,dict的键由可选的
fieldnames参数。fieldnames参数是一个序列,其
元素按顺序与输入数据的字段相关联。
这些元素成为结果字典的键。如果
如果省略fieldnames参数,则字段第一行中的值
csvfile将用作字段名
因此,如果我们利用这一点:
import csv
import string
results = []
mappings = [
[(string.ascii_uppercase[i-2], i) for i in range(2, 7)],
[(string.ascii_uppercase[i-2], i) for i in range(7, 10)]]
with open(input_file, 'rU') as control_file:
reader = csv.DictReader(control_file)
for row in reader:
row_data = {}
row_data['key1'] = row['key1']
row_data['key2'] = row['key2']
row_data['key3'] = {k:row[v] for k,v in mappings[0]}
row_data['key4'] = {k:row[v] for k,v in mappings[1]}
results.append(row_data)
如果使用
读写器
,您可以稍微改进代码:
创建一个像普通读取器一样运行的对象,但映射
读入dict的信息,dict的键由可选的
fieldnames参数。fieldnames参数是一个序列,其
元素按顺序与输入数据的字段相关联。
这些元素成为结果字典的键。如果
如果省略fieldnames参数,则字段第一行中的值
csvfile将用作字段名
因此,如果我们利用这一点:
import csv
import string
results = []
mappings = [
[(string.ascii_uppercase[i-2], i) for i in range(2, 7)],
[(string.ascii_uppercase[i-2], i) for i in range(7, 10)]]
with open(input_file, 'rU') as control_file:
reader = csv.DictReader(control_file)
for row in reader:
row_data = {}
row_data['key1'] = row['key1']
row_data['key2'] = row['key2']
row_data['key3'] = {k:row[v] for k,v in mappings[0]}
row_data['key4'] = {k:row[v] for k,v in mappings[1]}
results.append(row_data)
更好的是,如果你把整个事情变成一个生成器,它能产生
s adict
,你就可以得到results=[get\u rows('filename')中的行对行]
,这巧妙地避免了append()
。如果你把整个事情变成一个生成器,它能产生adict
,那就更好了,您可以只使用results=[get_rows('filename')中的行对行]
,这样可以巧妙地避免使用append()
。