2014-02-19 141 views
3

我在这样的文件中的数据:移调列表中的数据行

196465702|91017022|['95592022', '96094942', '100920382']|91048702 

,我会在下面转换数据:

196465702|91017022|95592022|91048702 
196465702|91017022|96094942|91048702 
196465702|91017022|100920382|91048702 

到目前为止,我已经尝试写这个。不确定这是否是一种准确和最佳的方式。而且,如果在第4列和第5列等列表中存在列表,则为每列循环并返回而变得棘手。

import csv 
with open('sample.out','r') as x: 
    f = csv.reader(x,delimiter='|') 
    for row in f: 
    s = row[2].translate(None,"'") 
    #print s.split(',') 
    for t in s.split(','): 
     print row[0]+'|'+row[1]+'|'+t.translate(None,"[None]")+'|'+row[3].translate(None,"None") 

有没有更好的方法来写这个?此外,如果数据列有少量列,是否有更好的方法来识别和转置行并将其余的数据连接回来?

回答

2

我会做这样的

data = "196465702|91017022|['95592022', '96094942', '100920382']|91048702" 
from ast import literal_eval 
first, second, third, last = data.split("|") 
third = literal_eval(third) 
for item in third: 
    print "{}|{}|{}|{}".format(first, second, item, last) 

输出

196465702|91017022|95592022|91048702 
196465702|91017022|96094942|91048702 
196465702|91017022|100920382|91048702 
+0

感谢literal_eval。它非常直观,而且更加紧凑。另外,如果我要添加更多列的列表值,这是好的吗? 'x =“196465702 | 91017022 | ['95592022','96094942','100920382'] | 91048702 | ['x','y']” from ast import literal_eval a,b,c,d,e = x.split(“|”) c = literal_eval(c) e = literal_eval(e) for cc in c: for ee in: print“{} | {} | {} | {} | {}“。格式(a,b,cc,d,ee)' – user3327034

+0

@ user3327034你有这个想法:)多数民众赞成在正确:) – thefourtheye

+0

一个相关的问题:如果'数据'是一个列表。 'a,b,c,d = t [0],t [1],t [2],t [3] c = literal_eval(c)' 这将不能解析 – user3327034