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

StackOverflow https://stackoverflow.com/questions/1020053

Вопрос

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

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

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

редактировать: Я реализовал предложения С.Лотт и Джимми, результат тот же.

изменить № 2: Я добавил «rb» и «wb» в функции open() согласно S.Предложение Лотта

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?)
Это было полезно?

Решение

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

source = open("PALTemplateData.csv","rb")
reader = csv.reader(source , dialect)

target = open("AnotherFile.csv","wb")
writer = csv.writer(target , dialect)

Обычный подход ко ВСЕМ манипуляциям с файлами заключается в создании модифицированной КОПИИ исходного файла.Не пытайтесь обновлять файлы на месте.Это просто плохой план.


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

В строках

source = open("PALTemplateData.csv","rb")

target = open("AnotherFile.csv","wb")

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

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

Для записи файла .CSV необходимо использовать «wb».В 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

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

Существует несколько рабочих модулей для работы с Excel CSV-файлами из Python - pyExcelerator является одним из их.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top