Как разобрать однострочную строку csv без итератора csv.reader в python? - PullRequest
1 голос
/ 25 февраля 2010

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

line = line.decode('windows-1250').encode('utf-8')

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

Есть ли способ сделать это красиво?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Спасибо за ответы. Упаковка дала мне идею:

def reencode(file):
    for line in file:
        yield line.decode('windows-1250').encode('utf-8')

csv_writer = csv.writer(open(outfilepath,'w'), delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
csv_reader = csv.reader(reencode(open(filepath)), delimiter=";",quotechar='"')
for c in csv_reader:
    l = # rearange columns here
    csv_writer.writerow(l)

Это именно то, что я собирался перекодировать как раз перед тем, как она будет проанализирована csv_reader.

2 голосов
/ 25 февраля 2010

В самом низу документации CSV находится набор классов (UnicodeReader и UnicodeWriter), который реализует поддержку Unicode для CSV:

rfile = open('input.csv')
wfile = open('output.csv','w')
csv_reader = UnicodeReader(rfile,encoding='windows-1250')
csv_writer = UnicodeWriter(wfile,encoding='utf-8')
for c in csv_reader:
    # process Unicode lines
    csv_writer.writerow(c)
rfile.close()
wfile.close()
2 голосов
/ 25 февраля 2010

Зацикливание строк в файле можно сделать следующим образом:

with open('path/to/my/file.csv', 'r') as f:
    for line in f:
        puts line # here You can convert encoding and save lines

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

$ iconv -f Windows-1250 -t UTF8 < file.csv > file.csv

Редактировать: Так в чем же проблема?

with open('path/to/my/file.csv', 'r') as f:
    for line in f:
        line = line.decode('windows-1250').encode('utf-8')
        elements = line.split(",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...