【问题标题】:Creating csv DictReader like object创建类似对象的 csv DictReader
【发布时间】:2020-11-06 02:02:35
【问题描述】:

在我的脚本中,我正在将 csv 文件读入字典。

csvreader = csv.DictReader(csvfile, delimiter=';', quotechar='"')

CSV 结构是:

"Name";"type"
"Name1";"type1"
"Name2";"type2"

然后我循环遍历csvreader 对象并将这些行用作创建请求的参数。如果响应代码是 404,我想创建类似的字典 err_obj_dict,其结构类似 csv 阅读器,其中包含请求失败的行:

err_obj_dict = {'Name': [], 'type': []}

for row in csvreader:
        if row['type'] == 'virtualResource':
            objType = 'virtual'
        else:
            objType = row['type']
....
....
if resp_cd == 400:
    err_obj_dict['Name'].append(row['Name'])
    err_obj_dict['type'].append(objType)

然后我想通过err_obj_dict 类似的方式循环通过csvreader 并创建请求:

 for row in err_obj_dict:
     resp_cd = ''
     if row['type'] == 'virtualResource':
         objType = 'virtual'
     else:
         objType = row['type']

但是脚本给了我:

if row['type'] == 'virtualResource':
TypeError: string indices must be integers, not str

似乎 DictReader 正在创建具有不同结构的不同类型的字典。有人可以帮我创建类似字典的 ReadDict 或如何遍历 err_obj_dict 以获得与 csvreader 相同的结果吗?

【问题讨论】:

    标签: python-2.7 csv dictionary


    【解决方案1】:

    如果你打印 csvreader 的结果,这就是输出。

    for row in csvreader:
        print(row)
    
    {'type': 'type1', 'Name': 'Name1'}
    {'type': 'type2', 'Name': 'Name2'}
    

    因此,我建议使用字典数组而不是具有两个键 NameType 的字典。

    err_obj_array = []
    for row in csvreader:
        if row['type'] == 'virtualResource':
            objType = 'virtual'
        else:
            objType = row['type']
    ....
    ....
    if resp_cd == 400:
      err_obj_dict = []
      err_obj_dict['Name'] = row['Name']
      err_obj_dict['type'] = objType
      err_obj_array.append(err_obj_dict)
    

    当你想再次循环时,你可以这样做

    for row in err_obj_array:
     resp_cd = ''
     if row['type'] == 'virtualResource':
         objType = 'virtual'
     else:
         objType = row['type']
    

    【讨论】:

    • 谢谢@Swetha Shanmugam,那我如何将 err_obj_array 写回 CSV 文件?
    • 您可以为此使用 csv DictWriter
    • 我希望这个答案对你有帮助,如果是,请接受它:)
    • 我帮助我简化了它,省略了err_obj_dict 并改用err_obj_array.append(dict(row)) 非常感谢
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多