2012-03-16 47 views
0

我一直在尝试这种转换格式的文本文件转换成CSV文件:如何使用sed来使用python

2012-03-16 13:47:30.465 -0400 START Running Lab.script 19 on_the 

我可以算出它使用SED的唯一方法,但是当我尝试在Python中使用子进程,它不会读取正确的命令,它会给我一个错误。此外,它不是正确的格式,我希望它与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,任何帮助,将不胜感激。

预先感谢您

UPDATE:

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

我们可以看到错误消息? – mfrankli 2012-03-16 19:20:47

+3

你试图转换成什么样的格式。你可以用所有的\ s和\ t来替换,并获得一个csv。这是你在找什么。为什么你会使用sed – nitin 2012-03-16 19:23:05

+1

多少个文件?他们有多大?顺便说一句:它已经是CSV格式(如果你可以使用制表符作为分隔符,并有源文件中的标签,而不是空格)... – Aprillion 2012-03-16 19:23:56

回答

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发送到标准输出的相同位置的正确方法。

完整代码:

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() 
+0

我试过使用csv.writer(),但是,当我使用它时,它使用逗号分隔每个单字母和数字,我只是希望它根据原始文本文件中相同的格式进行分隔。 – user1186173 2012-03-16 19:39:47

+0

@ user1186173 - 我还没有使用csv模块,但我认为你想在这里做的是使用'csv.reader(open('Logfile.txt',delimiter ='\ t'))'来创建一个读者,然后在那个读者的每一行写下''; '.join(row)'到您打开的.csv文件(正常的'open()'调用,而不是'csv.writer()')。 – 2012-03-16 19:47:39

+1

好的,我做了你的建议,我用新代码更新了这个页面。 csv文件看起来比它更好,但现在看起来像这样。 2,0,1,2,...,0,3,...,1,6,...,1,3,...,4,7,...,3,0,...,4,6,5,...,0, 4,0,0,;,S,T,A,R,T ,; – user1186173 2012-03-16 19:57:25