[Обратите внимание, что это вопрос, отличный от уже отвеченного Как заменить столбец с помощью встроенного в Python модуля записи .csv?]
Мне нужно выполнить поиск и замену (для одного столбца URL-адресов) в огромном файле Excel .csv. Поскольку я только начинаю изучать язык сценариев, я решил попробовать реализовать решение на python.
У меня возникают проблемы, когда я пытаюсь выполнить обратную запись в файл .csv после внесения изменений в содержимое записи. Я прочитал официальную документацию по модулю csv о том, как использовать средство записи, но нет примера, который охватывает этот случай. В частности, я пытаюсь выполнить операции чтения, замены и записи в одном цикле. Однако нельзя использовать одну и ту же ссылку на «строку» как в аргументе цикла for, так и в качестве параметра для write.writerow(). Итак, как только я внес изменения в цикл for, как я должен выполнить обратную запись в файл?
изменить: я реализовал предложения С. Лотта и Джимми, результат тот же.
редактирование №2: я добавил "rb" и "wb" в функции open() по предложению С. Лотта.
import csv
#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls'
csvfile = open("PALTemplateData.csv","rb")
csvout = open("PALTemplateDataOUT.csv","wb")
reader = csv.reader(csvfile)
writer = csv.writer(csvout)
changed = 0;
for row in reader:
row[-1] = row[-1].replace('/?', '?')
writer.writerow(row) #this is the line that's causing issues
changed=changed+1
print('Total URLs changed:', changed)
Изменить: Для справки, это новая полная трассировка от интерпретатора:
Traceback (most recent call last):
File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module>
for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)