0

我有这个python代码,

open('%s.log'%hname,'w').writelines([ line for line in open('%s_tmp.log' %hname) if 'word' in line])

这将打印与以下相同的行%hname_tmp.log

b'line contains blah\n'
b'This is the next line\n'

我想在写入新文件之前删除b'和。\n'像这样的东西:

line contains blah
This is the next line

我怎样才能做到这一点 ?我努力了

...writelines([line.rstrip() ...,

但这会将新日志文件中的所有内容都塞在一行中,同时仍保留\n'.

4

2 回答 2

2

以二进制形式打开输出文件:

open('%s.log'%hname, 'wb').writelines([ line for line in open('%s_tmp.log' %hname) if 'word' in line])

或在写入之前解码对象:bytes

open('%s.log'%hname, 'w').writelines([line.decode('ascii') for line in open('%s_tmp.log' %hname) if 'word' in line])

如果您的原始日志文件包含这些字符,则改为将二进制数据写入日志文件。ast.literal_eval()您可以使用实用程序函数将这些行重新解释为字节对象:

from ast import literal_eval

with open('%s.log'%hname, 'wb') as outfile:
    outfile.writelines(literal_eval(line.rstrip()) for line in open('%s_tmp.log' %hname) if 'word' in line)

literal_eval()就像 Python 编译器一样,获取表示 Python 文字的字符串并将它们转换回 Python 对象。

于 2013-08-27T18:58:39.483 回答
0

您正在以二进制形式读取文件。尝试用'rt'.

open('%s.log'%hname,'wt').writelines([ line for line in open('%s_tmp.log' %hname, 'rt') if 'word' in line])
于 2013-08-27T19:01:10.737 回答