2014-02-27 23 views
1

我目前在我的Python脚本中调用了一个python脚本,并试图将我的调用输出保存在一个CSV文件中。但是,现在它可以工作,但每个字符之间都会有逗号,所以输出不正确。CSV.writerow在每个字符之间都有逗号?

这是什么造成的?

import csv 
import GetAlexRanking #External Method exposed here 
import subprocess 
import pandas as p 
import tai 
import numpy as np 

loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter=' ') 
with open('train.tsv','rb') as tsvin, open('PageRanks.csv', 'wb') as csvout: 
    tsvin = list(np.array(p.read_table('train.tsv'))[:,0]) 
    csvout = csv.writer(csvout) 

    for row in tsvin: 
     count = 0 
     cmd = subprocess.Popen("python GetAlexRanking.py " + row , 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          shell=True) 
     (output, err) = cmd.communicate() 
     exit_code = cmd.wait() 
     print exit_code #testing 
     print output 
     print err 
     csvout.writerow(row + "\t" + output) #writing,error here 
     count+=1 

编辑:

在cmd中称为像这样"python GetAlexRanking.py www.google.com"当从函数返回的样本行:

www.google.com 
AlexaTrafficRank:1 
GooglePageRank:9 

我想这是保存在TSV为使(空格添加以使格式更清晰,所有列仅由制表符分隔:))

URL \t AlexaRank \t GoogleRank 
www.google.com \t 1 \t 9 
+0

请展示了一个排,看起来输出什么样,什么它应该看起来像。请注意,第一个输出到csv文件应该是标题行。你考虑过csv.DictWriter()吗? – sabbahillel

+0

请给出'tsvin'的示例元素。我只能假设'tsvin = list(np.array(p.read_table('train.tsv'))[:, 0])'实际上是返回一个单一的字符串,然后调用list()将它分成小块。例如。; >>> list(“helloworld”) ['h','e','l','l','o','w','o','r','l',' d'] – sleepycal

+0

@sabbahillel问题更新(我相信)所有信息。非常感谢你! –

回答

3

您将一个字符串传递给csv.write,然后它将其解释为一个列表,然后将其分割为每个列表元素(即字符)。我犯了这个错误太多次......

试试这个:

# add coustom code to split the row up into the values, hint user row.split() 
csvout.writerow([row, output]) 
1

看起来,如果你希望你的输入是一个清单,以及您的输出。因此,让您的输入保留一组字符串并将其分割成每行的列表。

您返回的样品行显示在三行中。这是否意味着它是一个具有列分隔符的长字符串?如果是这种情况,请分割输出并插入选项卡。

outrow = row # row is already a list 
    outrow.append(output.split('\t')) 
    csvout.writerow(outrow) 

再次看看您的示例,看起来您要输出两个tsv行,一个带有“标题”,另一个带有“等级”。因此(与多余的线条为了便于阅读)

outlist = output.split('\t') 
outname1 = outlist[1][0:outlist[1].index(':')-1] 
outname2 = outlist[2][0:outlist[2].index(':')-1] 
outrank1 = outlist[1][outlist[1].index(':')+1:] 
outrank2 = outlist[2][outlist[2].index(':')+1:] 
outrow1 = ['URL', outname1, outname2] 
outrow2 = [outlist[0], outrank1, outrank2] 

你可以这样写两个输出行,你好像把已经于您的样本输出

+0

@sabbaillel谢谢你的回应,但我很努力地理解这一点。我想保存我的输出制表符分隔,在输出的第一行中有一组列标题。你能告诉我如何使用你的代码来完成这个任务吗?不便之处敬请原谅。 –

+0

只是为了补充一点;此代码不会运行错误:文件“GeneratePageRanks.py”,第23行,在 outrow.append(output.split('\ t')) AttributeError:'str'object has no attribute'append' –

相关问题