Преобразование списка списков 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-модуль, как видно из таких вопросов, как это, но все его функции, похоже, работают на объекте «Файл». Списки настолько малы, что использование файла является излишним.

Я знаком с join, и есть много ответов SO об этом. Но это не обрабатывает значения, содержащие запятую, и не обрабатывает несколько строк, если только я не вложу join в другой join.


person Simon Lepkin    schedule 06.07.2016    source источник
comment
У вас есть примерные данные?   -  person Alexander    schedule 06.07.2016
comment
Возможный дубликат stackoverflow.com/ вопросы/19717769/   -  person andrralv    schedule 06.07.2016


Ответы (2)


Объедините csv-модуль с StringIO:

import io, csv

result = io.StringIO()
writer = csv.writer(result)
writer.writerow([5,6,7])
print(result.getvalue())
person Daniel    schedule 06.07.2016
comment
Ах, идеально! Я не был знаком с классом StringIO. Полностью стоит отрицательных голосов. :П - person Simon Lepkin; 07.07.2016

Подход в вопросе вы ссылка на в качестве ссылки для 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.StringIO и csv (см. ответ Даниэля).

Чтобы достичь первого, вы можете сделать

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)
person Alberto Garcia-Raboso    schedule 06.07.2016
comment
Как я уже упоминал в своем вопросе, это решение не обрабатывает значения, которые сами содержат запятую. Мой плохой, я должен был привести наглядный пример. Я отредактирую. - person Simon Lepkin; 06.07.2016