Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将csv行迭代分配给字典值的更具Python风格的方法?_Python_Csv_Dictionary - Fatal编程技术网

将csv行迭代分配给字典值的更具Python风格的方法?

将csv行迭代分配给字典值的更具Python风格的方法?,python,csv,dictionary,Python,Csv,Dictionary,我有一个CSV文件,其中的列包含我读入字典中特定位置的特定值,行和数据的独立实例相当于一个完整的字典。在进入下一行之前,我读入并使用这些数据计算每一行的某些值、处理一些输入等。我的问题是,如果我有一个标题详细说明了列的名称(键1和键3A,等等),我是否可以使用该信息来避免我当前使用的代码(如下所示) 是的,你可以 import csv with open(infile, 'rU') as infile: reader = csv.DictReader(infile) for

我有一个CSV文件,其中的列包含我读入字典中特定位置的特定值,行和数据的独立实例相当于一个完整的字典。在进入下一行之前,我读入并使用这些数据计算每一行的某些值、处理一些输入等。我的问题是,如果我有一个标题详细说明了列的名称(键1和键3A,等等),我是否可以使用该信息来避免我当前使用的代码(如下所示)

是的,你可以

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 a
dict
,你就可以得到
results=[get\u rows('filename')中的行对行]
,这巧妙地避免了
append()
。如果你把整个事情变成一个生成器,它能产生
a
dict
,那就更好了,您可以只使用
results=[get_rows('filename')中的行对行]
,这样可以巧妙地避免使用
append()