time.strptime() - 参数0必须是str,而不是字节

时间:2014-01-14 15:29:00

标签: python unicode time utf-8 strptime

显然我已经意识到strftimestrptime不喜欢字节字符串作为参数,但是我在这里发痒,因为我需要读取一个文件内容保存在其中的不同字符编码,我需要处理它们,并将此文本文件中每行的时间部分发送到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 个答案:

答案 0 :(得分:0)

line是一个字节字符串,因为您以二进制模式打开了文件。你需要解码字符串;如果它是与模式匹配的日期字符串,则只需使用ASCII:

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

你可以添加一个'ignore'参数来忽略任何非ASCII字符,但无论如何这条线都不适合你的日期格式。

请注意,您无法传递包含 more 的值,而不是其中包含的解析格式;无论您使用何种编解码器,strptime()模式未明确涵盖的其他文本行都将无效。

如果您的输入在编解码器中确实变化很大,那么无论如何都需要以某种方式捕获异常。

除了UTF-16或UTF-32之外,我不希望您遇到任何使用不同字节的阿拉伯数字的编解码器。如果您的输入确实在一个文件中混合了多字节和单字节编解码器,那么您手上就会遇到更大的问题,尤其是因为新行处理将会严重搞乱。

答案 1 :(得分: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