如何在Python中将csv文件从宽格式转换为长格式

时间:2015-04-03 13:22:16

标签: python csv row export-to-csv

想象以下情况:

Name    Links       Blabla

name1   a b c       x

name2   d e f g h   y

如您所见,链接字段有几个字符串由空格分隔。我想要获得的是:

Name    Links       Blabla

name1   a           x
name1   b           x
name1   c           x
name2   d           y
name2   e           y
name2   f           y
name2   g           y
name2   h           y

我不知道为什么它不起作用。这就是我到目前为止所做的:

reader = csv.DictReader(open(mySourceFile), delimiter = myDelimiter)
#..Code for opening Writer etc..
mySourceFileHeaders = reader.fieldnames
myExtraRows = row["Links"].split()
for line in reader:
   for counter in myExtrarows:
     writer.writerow(line)

我有点卡在这里。我会继续寻找(不是为了一颗金子般的心脏),但同时:感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

这是数据表从宽格式到长格式的标准转换(因此我建议编辑您的问题的标题)。

我不确定DictReader在这里获得了什么,但你需要使用嵌套循环来处理这个

with open(inputfile) as f1, open(outputfile,"w") as f2:
    r=csv.DictReader(f1)
    w = csv.writer(f2)
    w.writerow(r.fieldnames)

    for d in r:
        links=d['Links'].split()
        for l in links:
            w.writerow([d['Name'], l, d['Blabla']])

外部循环遍历输入文件。然后内部循环在当前输入行的Links字段中为每个条目写出一行。

使用with可确保在完成后关闭输入和输出文件。

给出以下输入

Name,Links,Blabla
name1,"a b c","x"
name2,"d e f g h","y"

这会产生这样的输出文件

Name,Links,Blabla
name1,a,x
name1,b,x
name1,c,x
name2,d,y
name2,e,y
name2,f,y
name2,g,y
name2,h,y

答案 1 :(得分:0)

我会从原始文件中读取每一行并写入 新csv所需的格式。

要将第二列链接分开,条件应该是 类似的东西:

for row in csv_rows:
    if len(row[1].split()) > 1:
        for link in row[1].split():
            new_csvfile.write(','.join(row[0], row[1].split()[link])
    else:
        new_csvfile.write(row)

答案 2 :(得分:0)

我最终得到了这个:

        writer = csv.DictWriter(open(myTargetFile, "w+"), myIncludeColumns, extrasaction='ignore')
        writer.writeheader()
        for line in reader:
            columnToSplit=line['links'].split()
            print "line = ", line
            print "columnToSplit = ", columnToSplit
            for eachlink in columnToSplit:
                print "eachlink = ", eachlink
                line['link']=eachlink
                writer.writerow(line)

编辑:它仍然不起作用,我必须忽略一些东西。现在我有了这个:

        for line in reader:
            links=line[myColumnToSplit].split()
            for linkcounter in links:
                writer.writerow(line)

虽然链接计数器的值是正确的,但它仍然写入原始(不是splittet)行。它只重复写入分割值数量的行数。因此,如果它必须分割4个值,它只是将该行写入4次,但是使用整个字符串,而不是分割的那个。