我一直试图转换这种格式:
2012-03-16 13:47:30.465 -0400 START Running Lab.script 19 on_the
我能解决的唯一方法是使用sed,但是当我尝试在python中使用subprocess时,它不会读取正确的命令,它会给我一个错误。此外,它不是正确的格式,我希望它类似于csv。
这就是我目前正在使用的内容:
f = open("newlogfile.csv", "w")
p = subprocess.Popen(["sed","-e","'s/^[ ]*//g'","-e","'s/\([0-9a-zA-Z\.]*\)","*/\1;/g'","LogFile.txt"], stdout=f, stderr=f)
f.close()
我很擅长使用子进程和使用sed的新手,任何帮助都将不胜感激。
提前谢谢
更新:
fin = csv.reader(open('LogFile.txt', 'rb'),delimiter='\t')
fout = csv.writer(open('newLogFile.csv', 'w'))
for row in fin:
fout.writerow(';'.join(row))
答案 0 :(得分:0)
你应该真正研究csv模块以获得更简洁的转换方法,我相信你会希望代码看起来像这样:
fin = csv.reader(open('LogFile.txt', 'rb'), delimiter='\t')
fout = open('newLogFile.csv', 'w')
for row in fin:
fout.write(';'.join(row) + '\n')
这个答案的其余部分应该有助于解释为什么你的sed方法不起作用以及如何解决它。
尝试将命令列表更改为以下内容:
["sed", "-e", "s/^[ ]*//g", "-e", "s/\([0-9a-zA-Z\.]*\)*/\1;/g", "LogFile.txt"]
请注意,第二个s/.../.../g
在原始示例中被拆分为两个条目,这可能是造成问题的原因。此外,您不需要单引号,因为Popen
将执行将参数列表中的整个条目作为单个参数传递给sed
所需的任何转义。
您还应该将stderr=f
替换为stderr=subprocess.STDOUT
,这是将stderr发送到与stdout相同位置的正确方法。
完整代码:
f = open("newlogfile.csv", "w")
args = ["sed", "-e", "s/^[ ]*//g", "-e", "s/\([0-9a-zA-Z\.]*\)*/\1;/g", "LogFile.txt"]
p = subprocess.Popen(args, stdout=f, stderr=subprocess.STDOUT)
f.close()