如何动态地将列附加到csv中

时间:2014-03-02 22:58:43

标签: python parsing csv append itertools

我正在尝试阅读CSV的第一列,使用此列运行网络服务,从中获取输出并将其附加到我的CSV。我想逐行完成这项工作。

这是我到目前为止所提出的:

loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter='\n')
with open('FinalCSV.csv','rb') as tsvin, open('FinalCSV.csv', 'a+b') as csvout:
    tsvin = list(np.array(p.read_table('train.tsv'))[:,0])
    writer = csv.writer(csvout)
    count = 0
    for row in csvout:
        sep = '|'
        row = row.split(sep, 1)[0]
        cmd = subprocess.Popen("python GetJustAlexaRanking.py " + row ,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           shell=True)
        (output, err) = cmd.communicate()
        exit_code = cmd.wait()
        outlist = output.split('\r\n')
        try:
          outrank1 = outlist[1][outlist[1].index(':')+1:]
        except ValueError:
          outrank1 = "?"
        row.append(str(outrank1).rstrip()) #writing,error here 
        print [str(outlist[0]).rstrip(), str(outrank1).rstrip()]
        count+=1

然而,这给了我错误

Traceback (most recent call last):
  File "File.py", line 28, in <module>
    row.append(str(outrank1).rstrip()) #writing,error here
AttributeError: 'str' object has no attribute 'append'

我怎样才能完成我想做的事?

编辑:

loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter='\n')
with open('FinalCSV.csv','rb') as tsvread, open('FinalCSVFin.csv', 'wb') as csvout:
    tsvin = list(np.array(p.read_table('train.tsv'))[:,0])
    writer = csv.writer(csvout)
    count = 0
    for row in tsvread:
        sep = '|'
        row = row.split(sep, 1)[0]
        cmd = subprocess.Popen("python GetJustAlexaRanking.py " + row ,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           shell=True)
        (output, err) = cmd.communicate()
        exit_code = cmd.wait()
        outlist = output.split('\r\n')
        try:
          outrank1 = outlist[1][outlist[1].index(':')+1:]
        except ValueError:
          outrank1 = "?"
        row = [row, outrank1.rstrip()]
        writer.writerow(row)
        print [str(outlist[0]).rstrip(), str(outrank1).rstrip()]
        count+=1

1 个答案:

答案 0 :(得分:1)

您的row不是列表,而是字符串:

row = row.split(sep, 1)[0]

然后在subprocess命令中使用该字符串。

你需要再次列出一个列表;而不是append,请使用:

row = [row, outrank1.rstrip()]

其中outrank1始终是一个字符串,无需在其上调用str()

请注意,如果您尝试同时读取和写入csvout文件句柄,则必须非常小心您的读写位置。您不能只写入文件句柄,并希望替换现有数据。最好使用一个单独的新文件来写入,并通过将一个文件移到另一个上来替换旧文件位置。