2014-02-19 143 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