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