将Python列表列表转换为字符串

时间:2016-07-06 20:06:32

标签: python python-2.7 csv stringio

如何最好地将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中。

2 个答案:

答案 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

编辑:

如果对象的字符串表示形式可能包含逗号,那么您可以执行以下操作来实现可以恢复原始列表列表的输出:

  1. 逃避那些逗号或
  2. 将所述字符串表示包装在某些引号中(然后你必须在你的值中转义该字符的出现)。这正是io.StringIOcsv的组合(参见Daniel的回答)。
  3. 要实现第一个,你可以做到

    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)
    
相关问题