2017-04-26 45 views
0

我有一個包含兩列的csv文件。第一個是一個stringID,而第二個是一個stringID列表。將csv字符串解析爲python中的列

列1 |列2

AAA | [u'xxx',u'yyy']

我的問題是如何創建一個新的csv與成對的字符串(兩列重複)?例如,

列1 |列2

AAA | u'xxx」

AAA | u'yyy」

非常感謝幫助我!我知道這個問題應該很簡單,但它一直困擾着我幾天......

+3

如果它一直在困擾你幾天,你應該有一些你已經嘗試過的代碼。請與我們分享。 – Chris

+0

你能告訴我們你有什麼代碼,所以我們可以幫你嗎?我們不在這裏爲你工作。 –

回答

0

這段代碼忽略了可能使用csv風格的處理,因爲我不確定字段是如何分隔的。我假設他們被'|'隔開性格,並且可能需要去除空白。我利用了對使用ast.literal_eval進行安全處理列表的評論。

>>> from io import StringIO 
>>> import ast 
>>> inputCSV = StringIO('''\ 
... Column1 | Column2 
... aaa | [u'xxx', u'yyy'] 
... bbb | [u'sss', u'ttt']''') 
>>> header = True 
>>> with inputCSV as inCSV: 
...  for line in inCSV.readlines(): 
...   
...   column1, column2 = [_.strip() for _ in line.split('|')] 
...   
...   
...   if header: 
...    print ('%s|%s' % (column1, column2)) 
...    header = False 
...   else: 
...    column2 = ast.literal_eval(column2) 
...    
...    for item in column2: 
...     print ('%s|%s' % (column1, item)) 
... 
Column1|Column2 
aaa|xxx 
aaa|yyy 
bbb|sss 
bbb|ttt 
+1

使用'eval()'幾乎總是錯誤的選擇。 ['ast.literal_eval()'](https://docs.python.org/3/library/ast.html?highlight=ast.literal_eval#ast.literal_eval)在更安全的情況下也可以正常工作。 – Chris

+0

謝謝,我沒有意識到這一點。很好知道! –

0

感謝您的建設性答案!儘管它對我來說並不是特別有用,但我確實受到了它的啓發,並提出了一些功能性代碼!

header = True 

with open('2.csv') as inCSV: 
writer = csv.writer(open('1.csv', 'wb')) 
for line in inCSV.readlines(): 
    column1, column2 = [_.strip() for _ in line.split(',',1)] 
    if header: 
     writer.writerow(('source','target')) 
     header = False 
    else: 
     temp=column2.replace("[","]").replace("]","").replace('"','').split(",") 
     for i in range(len(temp)): 
      data=(column1,temp[i]) 
      writer.writerow(data)