Запись с помощью встроенного модуля .csv Python

[Обратите внимание, что это уже другой вопрос от уже ответившего. Как заменить столбец с помощью встроенного модуля записи .csv Python? ]

Мне нужно сделать поиск и заменить (конкретный для одного столбца URL-адресов) в огромном файле Excel .csv. Поскольку я нахожусь на начальных этапах, пытаясь научить себя скриптовому языку, я решил, что попытаюсь реализовать решение в python.

У меня возникают проблемы при попытке записать обратно в CSV-файл после внесения изменений в содержимое записи. Я прочитал официальную документацию модуля csv о том, как использовать запись, но нет примера, охватывающего этот случай. В частности, я пытаюсь получить операции чтения, замены и записи, выполненные в одном цикле. Однако нельзя использовать одну и ту же ссылку «строка» как в аргументе for loop, так и в качестве параметра writer.writerow (). Итак, как только я внес изменения в цикл for, как мне записать в файл?

edit: Я внедрил предложения от S. Lott и Jimmy, все тот же результат

edit # 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) 

edit: Для вашей справки это новая полная трассировка из интерпретатора:

 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?) 

  • Каков наилучший интерфейс от Python 3.1.1 до R?
  • C Python: запуск кода Python в контексте
  • Включение вывода отладки для python 3 urllib
  • Какова логика порядка хеш-функций Python?
  • Как я могу представить «Enum» в Python?
  • Установка подушки для Python в Windows
  • Преобразование в Jython проекта Python 3.5 - UnicodeDecodeError: кодек Unicodeescape не может декодировать байты в позиции 4-10: незаконный символ Unicode
  • Разбирайте XML с (X) объектами HTML
  • 3 Solutions collect form web for “Запись с помощью встроенного модуля .csv Python”

    Вы не можете читать и писать тот же файл.

     source = open("PALTemplateData.csv","rb") reader = csv.reader(source , dialect) target = open("AnotherFile.csv","wb") writer = csv.writer(target , dialect) 

    Обычным подходом к управлению файлами ALL является создание измененной копии исходного файла. Не пытайтесь обновлять файлы на месте. Это просто плохой план.


    редактировать

    В строках

     source = open("PALTemplateData.csv","rb") target = open("AnotherFile.csv","wb") 

    «Rb» и «wb» абсолютно необходимы. Каждый раз, когда вы их игнорируете, вы открываете файл для чтения в неправильном формате.

    Вы должны использовать «rb» для чтения файла .CSV. У Python 2.x нет выбора. С Python 3.x вы можете опустить это, но явно используйте «r», чтобы дать понять.

    Вы должны использовать «wb» для записи файла .CSV. У Python 2.x нет выбора. С Python 3.x вы должны использовать «w».


    редактировать

    Похоже, вы используете Python3. Вам нужно сбросить «b» с «rb» и «wb».

    Прочтите это: http://docs.python.org/3.0/library/functions.html#open

    Открытие csv-файлов как двоичных файлов просто неверно. CSV – это обычные текстовые файлы, поэтому вам нужно открыть их с помощью

     source = open("PALTemplateData.csv","r") target = open("AnotherFile.csv","w") 

    Ошибка

     _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 

    происходит потому, что вы открываете их в двоичном режиме.

    Когда я открывал excel csv с помощью python, я использовал что-то вроде:

     try: # checking if file exists f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"') except IOError: f = [] for record in f: # do something with record 

    и он работал довольно быстро (я открывал два около 10 МБ каждого файла csv, хотя я сделал это с помощью python 2.6, а не версии 3.0).

    Существует несколько рабочих модулей для работы с файлами excel csv из python – pyExcelerator является одним из них.

    проблема в том, что вы пытаетесь записать в тот же файл, который вы читаете. напишите в другой файл, а затем переименуйте его после удаления оригинала.

    Python - лучший язык программирования в мире.