Мне сказали , что Python 3.3+ добавляет метод list.copy()
, который должен быть таким же быстрым, как нарезка:
newlist = old_list.copy()
Вы смешиваете стороны кодирования и декодирования.
Для декодирования у вас все в порядке. Вы открываете его как двоичные данные, chardet
первый 1K, затем снова открываете в текстовом режиме с использованием обнаруженной кодировки.
Но затем вы пытаетесь продолжить декодирование уже декодированных данных как ASCII, используя codecs.getreader
. Эта функция возвращает StreamReader
, который декодирует данные из потока. Это не сработает. Вам необходимо закодировать эти данные в ASCII.
Но непонятно, почему вы используете декодер потока codecs
или в первом место, когда все, что вы хотите сделать, это кодировать один кусок текста за один раз, чтобы вы могли его зарегистрировать. Почему бы просто не вызвать метод encode
?
log(csv_file.read().encode('ascii', 'ignore'))
Если вы хотите что-то, что вы можете использовать в качестве ленивого итерации строк, вы могли бы построить что-то полностью общее, но гораздо проще просто сделать что-то вроде примера UTF8Recorder
в документах csv
:
class AsciiRecoder:
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("ascii", "ignore")
Или еще проще:
with io.open(self.csv_path, 'r', encoding=detectedEncoding) as csv_file:
csv_ascii_stream = (line.encode('ascii', 'ignore') for line in csv_file)
Я немного опаздываю на вечеринку с этим, но вот альтернативное решение, используя codecs.StreamRecoder
:
from codecs import getencoder, getdecoder, getreader, getwriter, StreamRecoder
with io.open(self.csv_path, 'rb') as f:
csv_ascii_stream = StreamRecoder(f,
getencoder('ascii'),
getdecoder(detectedEncoding),
getreader(detectedEncoding),
getwriter('ascii'),
errors='ignore')
print(csv_ascii_stream.read())
Возможно, вы захотите использовать это, если вам нужна гибкость, чтобы иметь возможность вызывать read()
/ readlines()
/ seek()
/ tell()
и т. д. в потоке, который возвращается. Если вам просто нужно перебирать поток, выражение abarnert генератора будет немного более кратким.
getreader
-getwriter
), и теперьascii_stream.read()
просто возвращает исходный поток (EventId,Rate,Attribute1,Attribute2,(。・ω・。)ノ...
, то есть недействительный ASCII). Я пропустил еще один шаг? (Как начинать новый читатель с аутпитера писателя?) – Alain 10 October 2014 в 21:30UTF8Recoder
в документахcsv
, или я думаю, что вUnicode HOWTO
есть несколько, пока вы не получите эту идею. – abarnert 10 October 2014 в 21:30csv.reader
, который принимает только поток ascii. Я взглянул на этот UTF8Recoder, но с трудом выяснял, в какой момент поток был преобразован из исходной кодировки в нужную кодировку (что в моем случае было бы Ascii, но здесь здесь UTF8). – Alain 10 October 2014 в 21:35csv_ascii_stream = (line.encode('ascii', 'ignore') for line in csv_file)
сработала! Спасибо огромное! – Alain 10 October 2014 в 21:41