Вот несколько незначительных замечаний по вашему текущему коду:
- Неправильно использовать
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
описано в документации по модулю csv .
В качестве дальнейшего замечания у вас могут быть веские причины для того, чтобы принимать глобус в качестве параметра, а не только файлы в командной строке, ноэто немного удивительно - вам придется называть ваш скрипт как ./whatever.py '*.csv'
, а не просто ./whatever.py *.csv
.Вместо этого вы можете просто сделать:
for filename in sys.argv[1:]:
... и позволить оболочке расширить ваш глобус до того, как скрипт узнает об этом.
И еще одна вещь - текущий подходВзятие является немного опасным, в том случае, если что-то не получится при обратной записи в одно и то же имя файла, вы потеряете данные.Стандартный способ избежать этого - вместо этого записывать во временный файл и, если это было успешно, переименовать временный файл поверх оригинала.Таким образом, вы можете переписать все это как:
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)