如何最好地将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等SO问题所示,但它的所有函数似乎都在File对象上运行。列表足够小,使用文件是过度的。
我熟悉join功能,并且有很多SO答案about it。但是这不会处理包含逗号的值,也不会处理多行,除非我将join
嵌套在另一个join
中。
答案 0 :(得分:3)
将csv-module与StringIO
结合使用:
import io, csv
result = io.StringIO()
writer = csv.writer(result)
writer.writerow([5,6,7])
print(result.getvalue())
答案 1 :(得分:1)
您链接到的question中的方法作为join
的引用,以及嵌套的join
(这有什么问题?)的工作原理与您可以将列表列表中包含的所有对象转换为字符串:
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
编辑:
如果对象的字符串表示形式可能包含逗号,那么您可以执行以下操作来实现可以恢复原始列表列表的输出:
io.StringIO
和csv
的组合(参见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)