【问题标题】:"Doing work" on csv DictReader failscsv DictReader 上的“工作”失败
【发布时间】:2016-03-28 00:41:45
【问题描述】:

我正在编写一个脚本,我需要将 CSV 读入 DictReader,在字段上做一些工作(数据处理),然后通过 DictWriterDictReader 输出到 csv。

如果我读取 CSV 然后写入 Dict,则该过程有效。

#Create the sample file
headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.18, 'Volume':181800},
        {'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},
        {'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.46, 'Volume': 935000},
        ]

#Open sample file
with open('stocks.csv','w') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(rows)

#Output the dict    
with open('stocks.csv', 'r') as file:
    csvread = csv.DictReader(file, delimiter=',')

    with open('out.csv', 'w') as out:
        headertowrite = ['Time', 'Symbol', 'NewColumn']
        writer = csv.DictWriter(out, headertowrite, extrasaction='ignore')
        writer.writeheader()
        writer.writerows(csvread)
#Works!

但是 - 如果我添加一个新列,我似乎会丢失 DictReader 中的所有数据:

headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.18, 'Volume':181800},
        {'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},
        {'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',
          'Time':'9:36am', 'Change':-0.46, 'Volume': 935000},
        ]

with open('stocks.csv','w') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(rows)

with open('stocks.csv', 'r') as file:
    csvread = csv.DictReader(file, delimiter=',')


    for row in csvread:
        row['NewColumn'] = '1'

    with open('out.csv', 'w') as out:
        headertowrite = ['Time', 'Symbol', 'NewColumn']
        writer = csv.DictWriter(out, headertowrite, extrasaction='ignore')
        writer.writeheader()
        writer.writerows(csvread)
#Out.csv is blank!

有没有一种方法可以在编写之前对 DictReader 执行工作?

【问题讨论】:

    标签: python csv data-manipulation data-munging


    【解决方案1】:

    由于 csvread 已被您的第一个 for 循环完全消耗,我们的 with 语句将输出一个空白文件,您可能会注意到。

    您应该:

    --> 将行保存到变量中

    import csv
    headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
    rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.18, 'Volume':181800},
            {'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},
            {'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.46, 'Volume': 935000}]
    
    with open('stocks.csv','w') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()
        f_csv.writerows(rows)
    
    with open('stocks.csv', 'r') as file:
        csvread = csv.DictReader(file, delimiter=',')
    
        rows = []
        for row in csvread:
            row['NewColumn'] = '1'
            rows.append(row)
    
        with open('out.csv', 'w') as out:
            headertowrite = ['Time', 'Symbol', 'NewColumn']
            writer = csv.DictWriter(out, headertowrite, extrasaction='ignore')
            writer.writeheader()
            writer.writerows(rows)
    

    --> 在将输出文件的 with 语句中进行修改(读取一行,修改并写入。

    import csv
    headers = ['Symbol', 'Price', 'Date', 'Time', 'Change', 'Volume']
    rows = [{'Symbol':'AA', 'Price':39.48, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.18, 'Volume':181800},
            {'Symbol':'AIG', 'Price': 71.38, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.15, 'Volume': 195500},
            {'Symbol':'AXP', 'Price': 62.58, 'Date':'6/11/2007',
             'Time':'9:36am', 'Change':-0.46, 'Volume': 935000}]
    
    with open('stocks.csv','w') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()
        f_csv.writerows(rows)
    
    with open('stocks.csv', 'r') as file:
        csvread = csv.DictReader(file, delimiter=',')
    
        with open('out.csv', 'w') as out:
            headertowrite = ['Time', 'Symbol', 'NewColumn']
            writer = csv.DictWriter(out, headertowrite, extrasaction='ignore')
            writer.writeheader()
            for row in csvread:
                row['NewColumn'] = '1'
                writer.writerow(row)
    

    保重!在第二个解决方案中是writerow 而不是writerows

    请注意,我还强烈推荐第二种解决方案,它在内存消耗方面更具可扩展性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 2023-03-26
      • 2011-12-14
      • 2010-11-15
      • 2015-12-10
      • 1970-01-01
      • 2014-05-28
      • 2018-06-26
      相关资源
      最近更新 更多