【问题标题】:Convert a Python list of lists to a string将 Python 列表转换为字符串
【发布时间】:2016-11-09 00:38:02
【问题描述】:

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

【问题讨论】:

标签: python python-2.7 csv stringio


【解决方案1】:

您链接到的question 中的方法作为join 的参考,以及嵌套的joins(有什么问题?)只要您可以转换包含在您的列表到字符串的列表:

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 的组合所做的(见丹尼尔的回答)。

要实现第一个,你可以这样做

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)

【讨论】:

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

将 csv 模块与 StringIO 结合起来:

import io, csv

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

【讨论】:

  • 啊,完美!我不熟悉StringIO 类。完全值得反对。 :P
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2023-03-16
  • 2017-11-15
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
相关资源
最近更新 更多