2014-01-14 77 views
2

很显然,我已经知道strftimestrptime不喜欢字节字符串作为参数,但是我在这里是一个pickle,因为我有点需要读取保存在其中的具有不同字符编码的文件内容,并且我需要处理它们,并将本文档中每行的时间部分发送到strptime()time.strptime() - 参数0必须是str,而不是字节

一个快速的解决办法是分割字符串,确保时间只包含数字和破折号,但是有可能以某种方式传递字节对象而不试图找出编码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

你需要'.decode()',但不知道编码,这不是一件容易的事。 – geoffspear

+0

@Wooble:嗯,它适合日期时间模式,它几乎肯定会适合ASCII。 “ –

+0

”在其中保存了不同的字符编码,我需要处理它们全部“ – geoffspear

回答

0

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

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

您可以添加一个'ignore'论点忽略任何非ASCII,但机会是行不适合你的日期格式,然后呢。

请注意,您不能传递包含更多的值,而不是其中的解析格式;如果没有明确涵盖strptime()模式的其他文本,则无法使用您使用的任何编解码器。

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

除了UTF-16或UTF-32,我不希望你遇到任何使用不同字节的阿拉伯数字的编解码器。如果你的输入真的在一个文件中混合使用多字节和单字节编解码器,那么你的问题就更大了,而不是最重要的,因为换行处理将会大打折扣。

+0

''ignore''可以工作,因为它不知道导致问题的字符串的时间/日期部分是什么,很可能是来自客户端的日志条目,与标准英语语言相比,具有不寻常的语言设置大部分日志包含。因为我最感兴趣的时间/日期我可以做''ignore'',并让字符串在最后“腐败”,因为日期将完好无损,thx!这很可能解决它。 – Torxed

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

+0

这可能是一个好主意,但由于某些字节数据无法使用utf-8表转换,恐怕utf-8会在某些行上崩溃。不要问我是什么字符,因为我不太确定,因为造成这个问题需要大约半天的时间通过解析文件来找到它。我没有调试输出,当我注意到这个问题(stopid我):) – Torxed

+0

你可以处理错误与错误=(替换|忽略)如文档中所述 – gawel

相关问题