2017-06-17 64 views
-2

我有一個CSV文件,其中有超過100k條記錄,並且在該記錄中,一列中的值以逗號分隔,我想對該逗號分隔值進行排序。ValueError:關閉的文件上的I/O操作

的樣本數據:

"PT3QB789TSUIDF371261","THE TORONTO,DOMINION BANK","HZSN7FQBPO5IEWYIGC72","MAS,CA.ON.OSC,ASIC*,AAAA","XVCCCCCCCCCCYYUUUUU" 
"11111111111111111111","ABC,XYZ,QWE","HZSN7FQBPO5IEWYIGC72","POU,ABC,MAS,CA.QC.OSC,CA.ON.OSC","XVRRRRRRRRTTTTTTTTTTTTT" 
"22222222222222222222","BHC,NBC,MKY","HZSN7FQBPO5IEWYIGC72","BVC,AZX,CA.SK.FCAA,CA.NL.DSS","QQQQQQQQQRRCGHDKLKSLS" 

正如你可以看到有列2和4是有逗號分隔值列,但我想只有4個值進行排序。 所以我的輸出看起來應該如下:

"PT3QB789TSUIDF371261","THE TORONTO,DOMINION BANK","HZSN7FQBPO5IEWYIGC72","AAAA,ASIC*,CA.ON.OSC,MAS","XVCCCCCCCCCCYYUUUUU" 
"11111111111111111111","ABC,XYZ,QWE","HZSN7FQBPO5IEWYIGC72","ABC,CA.ON.OSC,CA.QC.OSC,MAS,POU","XVRRRRRRRRTTTTTTTTTTTTT" 
"22222222222222222222","BHC,NBC,MKY","HZSN7FQBPO5IEWYIGC72","AZX,BVC,CA.NL.DSS,CA.SK.FCAA","QQQQQQQQQRRCGHDKLKSLS" 

,我想寫的代碼如下:

#!/usr/bin/python 

import csv 

OUT_FILE = '/proj/ctc/temp/sanjay/REC-754/2017-05-29_IR_Position_Report_US_US_2017-05-30_out.csv' 
IN_FILE = '/proj/ctc/temp/sanjay/REC-754/2017-05-29_IR_Position_Report_US_US_2017-05-30.csv' 

f = open(IN_FILE, 'r') 
o = open(OUT_FILE,'w') 

with f: 
reader = csv.reader(f) 
with o: 
writer = csv.writer(o) 
for row in reader: 
    reportable_jurisdiction=row[68] 
    if ',' in reportable_jurisdiction: 
     row[68]=sorted(list(row[68].split(','))) 
     print " reportable Jurisdiction with comma "+reportable_jurisdiction 
    else: 
     print "reportable Jurisdiction if single "+reportable_jurisdiction 

     if(f.closed): 
      f=open(IN_FILE,"r") 
     if(o.closed): 
      o=open(OUT_FILE,"w") 
    writer.writerow(row) 
    print(row) 

,但是當我執行這個python腳本我得到以下錯誤:

$./Csvreader2.py 
Traceback (most recent call last): 
    File "./Csvreader2.py", line 15, in <module> 
    for row in reader: 
ValueError: I/O operation on closed file 

我走出這個問題和問題是與代碼 的縮進,但我得到了新的問題

Traceback (most recent call last): 
    File "./Csvreader2.py", line 14, in <module> 
    reportable_jurisdiction=row[68] 
IndexError: list index out of range 

在我的CSV文件中有100多列,但爲什麼會出現此錯誤?

+1

縮進你的代碼。您需要保持文件處於打開狀態,直到完成讀取操作爲止,'csv.reader()'不會將所有數據存入內存,您需要保持文件處於打開狀態。 –

+0

感謝您的輸入..代碼以相同的方式縮進。但問題仍然一樣。 – user2779202

+0

是的,我是說問題出在你的縮進上。這是錯誤的。您需要將第二個'with'語句縮進到與'reader ='相同的級別,或者將這兩個'with'語句合併爲一個。你的第一個'with'語句*結束*並且關閉'f'。 –

回答

1

您正在使用文件作爲上下文管理器:

with f: 
    # ... 
with o: 
    # ... 

一旦with塊結束(的後續碼縮進級別低於或等於with語句壓痕),該文件是關閉和不能再被讀取。這意味着文件f在執行with o:行時關閉。

但是,您需要f保持打開狀態,以便您可以通過csv.reader對象繼續讀取它。保留兩個文件在同一時間打開,通過把所有的代碼下一個with聲明:使用`F`不屬於`with`塊保持打開狀態之外

with f, o: 
    reader = csv.reader(f) 
    writer = csv.writer(o) 
    for row in reader: 
     # ... 
相關問題