這裏是您目前的代碼一些小筆記:
- 這是一個糟糕的主意,用
file
作爲變量名,因爲這陰影內置類型。
- 您可以使用
with
語法自動關閉文件對象。
- 難道你不想在標題行中添加一個額外的列,名爲
Filename
,而不是僅僅省略第一行中的一列?
- 如果你的文件名在它們中有逗號(或者不太可能是換行符),你需要確保文件名被引用 - 只是追加它不會。
最後的考慮將傾向於使用csv
模塊來代替,它將處理引用和不引用。例如,你可以嘗試像下面的代碼:
import glob
import csv
import sys
for filename in glob.glob(sys.argv[1]):
data = []
with open(filename) as finput:
for i, row in enumerate(csv.reader(finput)):
to_append = "Filename" if i == 0 else filename
data.append(row+[to_append])
with open(filename,'wb') as foutput:
writer = csv.writer(foutput)
for row in data:
writer.writerow(row)
可以從輸入文件略有不同引述的數據,所以你可能要與報價選項發揮csv.reader
和csv.writer
描述in the documentation for the csv module。
作爲一個進一步的觀點,你可能有充分的理由將glob作爲參數而不僅僅是命令行上的文件,但這有點令人驚訝 - 你必須將你的腳本作爲./whatever.py '*.csv'
而不是僅僅調用./whatever.py *.csv
。相反,你可以這樣做:
for filename in sys.argv[1:]:
...並讓shell在腳本知道任何事情之前展開您的glob。
最後一件事 - 當前採用的方法有點危險,因爲如果寫回相同的文件名時出現任何錯誤,您將丟失數據。避免這種情況的標準方法是寫入臨時文件,如果成功,則將臨時文件重命名爲原始文件。所以,你可能重寫整個事情:
import csv
import sys
import tempfile
import shutil
for filename in sys.argv[1:]:
tmp = tempfile.NamedTemporaryFile(delete=False)
with open(filename) as finput:
with open(tmp.name,'wb') as ftmp:
writer = csv.writer(ftmp)
for i, row in enumerate(csv.reader(finput)):
to_append = "Filename" if i == 0 else filename
writer.writerow(row+[to_append])
shutil.move(tmp.name,filename)
這是一個很好的例子,由於做。 – Richard 2011-09-27 12:02:18
極好的例子。感謝您使用tempfile的建議! – aravenel 2012-06-15 18:31:50