【问题标题】:How to read a csv file into something like a "record" data type?如何将 csv 文件读入类似“记录”数据类型的内容?
【发布时间】:2015-11-01 21:24:07
【问题描述】:

对于 Python 3.4.0

大家好, 我有一个如下所示的 csv 文件:

string1;value1
string2;value2
string3;value3

我想做的是把这个 csv 文件变成某种“记录”数据类型,这样我就可以例如在 stringbig 中查找 stringX,如果找到 stringX,则将 +1 添加到 valueX。

最简单的编码方法是什么?

提前致谢

【问题讨论】:

    标签: python csv python-3.x


    【解决方案1】:

    您可以将行变成namedtuples。这是一个简单的例子:

    import csv
    from collections import namedtuple
    
    Record = namedtuple('Record', ['product', 'part_number', 'category'])
    
    mydict = defaultdict(dict)
    with open('inventory.csv', 'rb') as inf:
        for rec in map(Record._make, csv.reader(inf)):
            print(rec.part_number)
    

    【讨论】:

      【解决方案2】:

      您可以只使用内置的csv 模块和一个简单的python 字典:

      import csv 
      
      records = {}
      with open('/path/to/your/file.csv','rb') as fileobj:
          reader = csv.reader(fileobj, delimiter=';')
          for key, value in reader:
              records[key] = int(value)
      

      然后您可以通过以下方式轻松更新valueXstringX

      records[stringX] = records.get(stringX, 0) + 1
      

      【讨论】:

        【解决方案3】:

        您可以为此使用 DictReader:

        CSV:

        Name;Value
        string1;0
        string2;20
        string3;12
        

        Python:

        import csv
        with open("data.csv", 'r') as f:
            r = csv.DictReader(f, delimiter=';')
            for row in r:
              if 'string2' in row['Name']:
                  row['Value'] += 1
                  print(row)
                  
        {'Value': 21, 'Name': 'string2'}
                  
        

        【讨论】:

        • 似乎几乎可以工作,但有一个错误:“无法将“int”对象隐式转换为 str - 我认为,列“值”被读取为字符串,但通常应该被读取为整数......有什么想法吗?编辑:只需添加一个“row['Value'] = int(row['Value'])” - 现在它可以工作了!非常感谢!
        • @AtillaW。您是否具有与我的答案中显示的相同的文件结构?你的文件中是否有标题让 DictReader 工作第一行应该是标题 -> 名称;值
        • 是的,完全一样的结构。
        • 啊可能是一个原因:我的 3.4.0。
        • @AtillaW。应该不是问题..这是一个简单的代码。我敢打赌,如果您复制并粘贴数据和代码,它将起作用。
        猜你喜欢
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2020-11-22
        • 2011-09-01
        • 2019-06-19
        相关资源
        最近更新 更多