time.strptime () – аргумент 0 должен быть str, а не байтами

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

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

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

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

2 Solutions collect form web for “time.strptime () – аргумент 0 должен быть str, а не байтами”

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

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

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

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

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

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

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

 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

  • Почему этот HTML-шаблон на jinja2 / python создает ошибку 'u ()' tuple при замене строк?
  • Зачем объявлять unicode по строке в python?
  • модуль python, такой как csv-DictReader с полной поддержкой utf8
  • Декодирование с двойной кодировкой utf8 в Python
  • Ошибка кодирования в Django на Heroku
  • Как преобразовать символы xxY в UTF-8 в Python?
  • декодирование-кодирование UTF-8 не приводит к исходному юникоду
  • Почему вывод print в python2 и python3 отличается от той же строки?
  • Python - лучший язык программирования в мире.