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


问题内容

显然,我已经意识到了这一点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 ...',我可以剥离它。


问题答案:

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

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

您可以添加一个'ignore'参数以忽略任何非ASCII的内容,但是无论如何,该行很可能不适合您的日期格式。

请注意,您无法通过一个包含价值 比它解析格式; strptime()无论您使用哪种编解码器,一行上没有其他文本的行都不会被模式明确覆盖。

而且,如果您的输入确实在编解码器中变化很大,则无论如何都需要捕获异常。

除了UTF-16或UTF-32,我不希望您遇到任何使用不同字节作为阿拉伯数字的编解码器。如果您的输入确实在一个文件中混合了多字节和单字节编解码器,那么您手头的问题就更大了,这至少是因为换行处理会变得很混乱。