2014-01-14 2 views
2

Очевидно, что я уже знаю, что strftime и strptime не любят байтовые строки в качестве параметров, однако я в рассоле здесь, потому что мне нужно прочитайте содержимое файла, в котором сохранены различные кодировки символов, и мне нужно обработать их все, и отправьте временную часть каждой строки в этом текстовом файле на strptime().time.strptime() - аргумент 0 должен быть str, а не байтами

Быстрое исправление будет состоять в том, чтобы разбить строку, убедившись, что время просто содержит числа и тире, но возможно ли каким-то образом передать объект байта, не пытаясь определить кодировку до strptime()?

with open('file.txt', 'rb') as fh: 
    for line in fh: 
     time.strptime(line, '%Y-%m-%d ...') 

Это, очевидно, не получится. Я думал, что делать repr(line) но что заставляет строку выглядеть b'2014-01-07 ...', который я мог бы раздеть ..

+0

Вы должны '.decode()', но не зная кодировку, это не будет легко. – geoffspear

+0

@Wooble: Ну, это соответствует шаблону даты и времени, это почти наверняка будет соответствовать ASCII. –

+0

"имеет различные кодировки символов, сохраненные в нем, и мне нужно обрабатывать их все" – geoffspear

ответ

0

line является байтовой строкой, потому что вы открыли файл в двоичном режиме. Вам нужно будет декодировать строку; если строка даты, соответствующую шаблон, вы можете просто использовать ASCII:

time.strptime(line.decode('ascii'), '%Y-%m-%d ...') 

Вы можете добавить 'ignore' аргумент игнорировать все не-ASCII, но скорее всего, линия не будет соответствовать вашему формату дата, то в любом случае ,

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

И если ваш вход действительно сильно меняется в кодеках, вам все равно придется ловить исключения так или иначе.

Помимо UTF-16 или UTF-32, я не ожидал, что вы столкнетесь с любыми кодеками, которые используют разные байты для арабских цифр. Если ваш вход действительно смешивает многобайтовые и однобайтовые кодеки в одном файле, у вас есть большая проблема с вашей стороны, ни в коем случае, потому что обработка новой строки будет сильно испорчена.

+0

''ignore'' мог бы работать, поскольку вопрос о том, что стоит за частью времени/даты строки, вызывающей проблему, скорее всего, является записью с клиента с необычными языковыми настройками по сравнению со стандартным английским языком большая часть журналов содержит. И так как меня больше всего интересует время/дата, я могу просто сделать ''ignore'', и пусть строка будет« повреждена »в конце, так как дата будет неповреждена, thx! Это, скорее всего, решает. – Torxed

0

Вы должны декодировать данные, когда вы читаете файл:

import codecs 
with codecs.open('file.txt', encoding='utf8') as fh: 
    for line in fh: 
     time.strptime(line, '%Y-%m-%d ...') 

Это всегда лучше, чтобы декодировать контент как можно скорее.

Также проверьте http://docs.python.org/2/library/codecs.html#codecs.open

+0

Это может быть хорошей идеей, но я боюсь, что utf-8 будет разбиваться на определенные строки из-за того, что определенные байтовые данные не могут быть преобразованы с использованием таблицы utf-8. Не спрашивайте меня, что это за персонаж, потому что я не совсем уверен, потому что причиной этой проблемы занимаются около полудня разбора файлов, чтобы найти его.У меня не было вывода отладки, когда я заметил эту проблему (стоппинг меня) :) – Torxed

+0

вы можете обрабатывать ошибки с ошибками = (заменить | игнорировать), как описано в документе – gawel

Смежные вопросы