如何使用sed将文本文件转换为使用python的CSV文件

时间:2012-03-16 19:17:43

标签: python sed

我一直试图转换这种格式:

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))

1 个答案:

答案 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()