2015-12-21 43 views
1

我在寫一個腳本,需要將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執行工作之前,我把它寫?

回答

3

由於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在第二個解決方案!

請注意,我還強烈建議第二個解決方案,它在內存消耗方面更具可擴展性。