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 ...'
,我可以剥离它。
问题答案:
line
是一个字节字符串,因为您以二进制模式打开了文件。您需要解码字符串;如果它是与模式匹配的日期字符串,则可以简单地使用ASCII:
time.strptime(line.decode('ascii'), '%Y-%m-%d ...')
您可以添加一个'ignore'
参数以忽略任何非ASCII的内容,但是无论如何,该行很可能不适合您的日期格式。
请注意,您无法通过一个包含价值 更 比它解析格式; strptime()
无论您使用哪种编解码器,一行上没有其他文本的行都不会被模式明确覆盖。
而且,如果您的输入确实在编解码器中变化很大,则无论如何都需要捕获异常。
除了UTF-16或UTF-32,我不希望您遇到任何使用不同字节作为阿拉伯数字的编解码器。如果您的输入确实在一个文件中混合了多字节和单字节编解码器,那么您手头的问题就更大了,这至少是因为换行处理会变得很混乱。