2016-07-06 197 views
0

如何最好地將Python列表中的列表轉換爲(例如)逗號分隔值,換行符分隔的行,字符串?理想情況下,我可以做這樣的事情:將列表的Python列表轉換爲字符串

>import csv 

>matrix = [["Frodo","Baggins","Hole-in-the-Ground, Shire"],["Sauron", "I forget", "Mordor"]] 
> csv_string = csv.generate_string(matrix) 
>print(csv_string) 
Frodo,Baggins,"Hole-in-the-Ground, Shire" 
Sauron,I forget,Mordor 

我知道Python有一個csv module,如像this但它的所有功能,因此看到的問題似乎一個文件對象進行操作。這些列表足夠小,以至於使用文件是矯枉過正的。

我熟悉join函數,並且有很多SO答案about it。但是這不處理包含逗號的值,也不處理多行,除非我在另一個join中嵌套join

+3

你有一些樣本數據? – Alexander

+1

可能的重複http://stackoverflow.com/questions/19717769/convert-list-of-lists-into-a-string – andrralv

回答

3

合併CSV模塊與StringIO

import io, csv 

result = io.StringIO() 
writer = csv.writer(result) 
writer.writerow([5,6,7]) 
print(result.getvalue()) 
+0

啊,完美!我不熟悉'StringIO'類。完全值得降價。 :P –

1

在你的嵌套join秒(這有什麼錯嗎?)鏈接到作爲join參考,一起question的方法工作,只要你可以轉換所有包含在你的列表清單所涉及的對象串:

list_of_lists = [[1, 'a'], [2, 3, 'b'], ['c', 'd']] 
joined = '\n'.join(','.join(map(str, row)) for row in list_of_lists) 
print(join) 

輸出:

1,a 
2,3,b 
c,d 

編輯:

如果字符串表示你的對象可能包含逗號,這裏有一些事情你可以做些什麼來實現輸出,可以恢復列表的原始列表:

  1. 逃避那些逗號或
  2. 包裹說一番風味串代表的引號(然後你不得不在你的值內跳出該字符的出現)。這正是io.StringIOcsv的組合(見Daniel的答案)。

爲了實現第一個,你可以做

import re 

def escape_commas(obj): 
    return re.sub(',', '\,', str(obj)) 

joined = '\n'.join(','.join(map(escape_commas, row)) for row in list_of_lists) 

對於第二個,

import re 

def wrap_in_quotes(obj): 
    return '"' + re.sub('"', '\"', str(obj)) + '"' 

joined = '\n'.join(','.join(map(wrap_in_quotes, row)) for row in list_of_lists) 
+0

正如我在我的問題中提到的,該解決方案不處理本身包含逗號的值。我的不好,我應該提供一個明確的例子。我會編輯。 –