Как установить кодировку файла при получении файла из Paramiko [duplicate]

Мне сказали , что Python 3.3+ добавляет метод list.copy() , который должен быть таким же быстрым, как нарезка:

newlist = old_list.copy()

0
задан Alain 10 October 2014 в 21:07
поделиться

2 ответа

Вы смешиваете стороны кодирования и декодирования.

Для декодирования у вас все в порядке. Вы открываете его как двоичные данные, 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)
1
ответ дан abarnert 22 August 2018 в 01:40
поделиться
  • 1
    Спасибо, что посмотрели на это. Журнал предназначен только для целей отладки, поэтому я мог видеть, что читает мой читатель. Я хочу сделать эквивалент того, что вы делаете (перекодирование как ascii), но в потоке. Это возможно? – Alain 10 October 2014 в 21:27
  • 2
    Я сделал то, что вы предложили (convertet getreader - getwriter), и теперь ascii_stream.read() просто возвращает исходный поток (EventId,Rate,Attribute1,Attribute2,(。・ω・。)ノ..., то есть недействительный ASCII). Я пропустил еще один шаг? (Как начинать новый читатель с аутпитера писателя?) – Alain 10 October 2014 в 21:30
  • 3
    @Alain: Конечно. Просто не используя устройство для декодирования. Если вы можете точно показать, что вы пытаетесь сделать, я могу показать вам, как это сделать. Но вы можете просто взглянуть на примеры, такие как UTF8Recoder в документах csv, или я думаю, что в Unicode HOWTO есть несколько, пока вы не получите эту идею. – abarnert 10 October 2014 в 21:30
  • 4
    Моя конечная цель - запустить поток через csv.reader, который принимает только поток ascii. Я взглянул на этот UTF8Recoder, но с трудом выяснял, в какой момент поток был преобразован из исходной кодировки в нужную кодировку (что в моем случае было бы Ascii, но здесь здесь UTF8). – Alain 10 October 2014 в 21:35
  • 5
    Кажется, что линия csv_ascii_stream = (line.encode('ascii', 'ignore') for line in csv_file) сработала! Спасибо огромное! – Alain 10 October 2014 в 21:41

Я немного опаздываю на вечеринку с этим, но вот альтернативное решение, используя 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 генератора будет немного более кратким.

1
ответ дан dano 22 August 2018 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: