2016-07-06 200 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

正如我在我的问题中提到的,该解决方案不处理本身包含逗号的值。我的不好,我应该提供一个明确的例子。我会编辑。 –