python line strip \ n和write line

时间:2013-08-27 18:53:59

标签: python python-3.x

我有这个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'

2 个答案:

答案 0 :(得分: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() utility function

将这些行重新解释为字节对象
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编译器一样。

答案 1 :(得分:0)

您正在将文件读取为二进制文件。尝试使用'rt'打开。

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