csv DictReader的“正在工作”失败

问题描述:

我在写一个脚本,需要将CSV读取到DictReader,在字段(数据管理)上做一些工作,然后通过DictWriterDictReader输出到csv。csv DictReader的“正在工作”失败

如果我读了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执行工作之前,我把它写?

由于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) 

- >让内你的修改与将输出的文件(阅读声明一行,修改并写入。

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在第二个解决方案!

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