Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将csv文件从宽格式转换为长格式_Python_Csv_Row_Export To Csv - Fatal编程技术网

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

如何在Python中将csv文件从宽格式转换为长格式,python,csv,row,export-to-csv,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

想象一下以下情况:

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)

我有点被困在这里了。我会继续寻找(不是为了一颗金子般的心),但与此同时:任何帮助都是感激的

我会从原始文件中读取每一行并写入 将所需格式转换为新的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)

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

我不确定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字段中为每个条目写出一行

一起使用可确保在完成操作时关闭输入和输出文件

给定以下输入

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
我的结局是:

        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次,但使用整个字符串,而不是拆分的字符串。

好的,谢谢您的帮助。您的结果给了我一个语法错误,我将进一步研究;-)
code
writer=csv.DictWriter(打开(myTargetFile,“w+”),myIncludeColumns,extrasaction='ignore')writer.writeheader()用于读卡器中的行:columnToSplit=line['links'].split()print“line=,line print“columnToSplit=”,columnToSplit:print“eachlink=,eachlink writer.writerow({'links':each link})
code
中的每个hlink的columnToSplit在最后一行:我需要第一列和最后一列的值。