2013-04-15 335 views
13

我可以使用Python的CSV庫或類似技術以內聯方式修改CSV文件嗎?使用Python編輯內聯CSV文件

當前我正在處理文件並更新第一列(名稱字段)以更改格式。我的代碼的簡化版本是這樣的:

with open('tmpEmployeeDatabase-out.csv', 'w') as csvOutput: 
    writer = csv.writer(csvOutput, delimiter=',', quotechar='"') 

    with open('tmpEmployeeDatabase.csv', 'r') as csvFile: 
     reader = csv.reader(csvFile, delimiter=',', quotechar='"') 

     for row in reader: 
      row[0] = row[0].title() 
      writer.writerow(row) 

哲學作品,但我很好奇,如果讓我沒有複製文件,我可以做一個在線編輯。

我試過了,但是這會將新記錄追加到文件末尾而不是替換它們。

with open('tmpEmployeeDatabase.csv', 'r+') as csvFile: 
    reader = csv.reader(csvFile, delimiter=',', quotechar='"') 
    writer = csv.writer(csvFile, delimiter=',', quotechar='"') 

    for row in reader: 
     row[1] = row[1].title() 
     writer.writerow(row) 
+0

一般來說,不,你不能那樣做。你可以讀取''r''文件中的所有數據,並將其包裝在一個'StringIO'對象中。然後,您可以將其傳遞給csv閱讀器,關閉文件並重新打開以便寫入... – mgilson

回答

35

不,您不應該試圖寫入您正在閱讀的文件。你可以可以這樣做,如果你在讀一行後保持seek回來,但不可取,特別是如果你寫回的數據比你讀的還多。

規範的方法是寫一個新的臨時文件,並將其移到您讀取的舊文件上。

from tempfile import NamedTemporaryFile 
import shutil 
import csv 

filename = 'tmpEmployeeDatabase.csv' 
tempfile = NamedTemporaryFile(delete=False) 

with open(filename, 'rb') as csvFile, tempfile: 
    reader = csv.reader(csvFile, delimiter=',', quotechar='"') 
    writer = csv.writer(tempfile, delimiter=',', quotechar='"') 

    for row in reader: 
     row[1] = row[1].title() 
     writer.writerow(row) 

shutil.move(tempfile.name, filename) 

我利用這裏的tempfileshutil庫,使任務更容易。

4

沒有底層系統調用數據插入到文件中。你可以覆蓋,你可以追加,你可以替換。但是,將數據插入到中間意味着從您進行編輯的點開始讀取並重寫整個文件。這樣做的兩種方法是(a)將整個文件拖入內存,在那裏進行編輯,然後將結果轉儲回磁盤,或者(b)打開臨時輸出文件您在讀取輸入文件時編寫結果,然後在結束後用新文件替換舊文件。一種方法使用更多內存,另一種使用更多磁盤空間。