更多pythonic方式迭代地将csv行分配给字典值?

时间:2016-02-15 05:30:32

标签: python csv dictionary

我有一个CSV文件,其中包含我读入字典中特定位置的特定值的列,以及与单个完整字典相等的数据实例。我读入然后使用这些数据计算某些值,处理每行的一些输入等,然后再转到下一行。我的问题是,如果我有一个特定列名称的标题(Key1与Key 3A等),我可以使用该信息来避免我目前正在使用的某些代码(下图)。

    with open(input_file, 'rU') as controlFile:
    reader = csv.reader(controlFile)
    next(reader, None)  # skip the headers
    for row in reader:
        # Grabbing all the necessary inputs
        inputDict = {}
        inputDict["key1"] = row[0]
        inputDict["key2"] = row[1]
        inputDict["key3"] = {}
        inputDict["key3"].update({"A" : row[2]})
        inputDict["key3"].update({"B" : row[3]})
        inputDict["key3"].update({"C" : row[4]})
        inputDict["key3"].update({"D" : row[5]})
        inputDict["key3"].update({"E" : row[6]})

            inputDict["Key4"] = {}
            inputDict["Key4"].update({"F" : row[7]})
            inputDict["Key4"].update({"G" : float(row[8])})
            inputDict["Key4"].update({"H" : row[9]})

3 个答案:

答案 0 :(得分:2)

如果您使用DictReader,则可以稍微改进一下代码:

  

创建一个像普通读者一样操作的对象,但是映射它   读入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)

答案 1 :(得分:0)

是的,你可以。

import csv
with open(infile, 'rU') as infile:
     reader = csv.DictReader(infile)
     for row in reader:
          print(row)

答案 2 :(得分:0)

看看这段代码。

    fields = csv_data.next()

    for row in csv_data:
        parsed_data.append(dict(zip(fields,row)))