Python 如何将 csv 文件从宽格式转换为长格式
How to transform a csv file from wide form to long form in Python
想象一下以下情况:
Name Links Blabla
name1 a b c x
name2 d e f g h y
如您所见,link 字段有几个字符串被 space 分割。我想要获得的是:
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)
这是数据 table 从宽格式到长格式的标准转换(因此我建议对您的问题标题进行编辑)。
我不确定 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']])
外层循环遍历输入文件。然后,内部循环在当前输入行的链接字段中为每个条目写出一行。
使用 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
我最终得到了这个:
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)
尽管 link 计数器的值是正确的,它仍然写入原始(不是拆分)行。它只是重复写入拆分值数量的行数。因此,如果它必须拆分 4 个值,它只需将该行写入 4 次,但使用整个字符串,而不是拆分的字符串。
想象一下以下情况:
Name Links Blabla
name1 a b c x
name2 d e f g h y
如您所见,link 字段有几个字符串被 space 分割。我想要获得的是:
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)
这是数据 table 从宽格式到长格式的标准转换(因此我建议对您的问题标题进行编辑)。
我不确定 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']])
外层循环遍历输入文件。然后,内部循环在当前输入行的链接字段中为每个条目写出一行。
使用 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
我最终得到了这个:
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)
尽管 link 计数器的值是正确的,它仍然写入原始(不是拆分)行。它只是重复写入拆分值数量的行数。因此,如果它必须拆分 4 个值,它只需将该行写入 4 次,但使用整个字符串,而不是拆分的字符串。