Python преобразовать строку в список по разделителю

Как в Python преобразовать строку в список по разделителю "," Если внутри части строки есть запятая, то эта часть строки выделяется двойными кавычки

Например, строку:

данные, "данные, внутри которых есть запятая", "в этих ""данных, есть и запятая"" и кавычки"

преобразовать в список:

['данные', '"данные, внутри которых есть запятая"', '"в этих ""данных, есть и запятая"" и кавычки"']

Ответы (3 шт):

Автор решения: Johan

Можно вот так вот попробовать:

result = []
data = 'данные', '"данные, внутри которых есть запятая"', '"в этих ""данных, есть и запятая"" и кавычки"'

for d in data:
    if "," in d:
        sp = d.split(",")
        for s in sp:
            result.append(s)
    else:
        result.append(d)

print(result)

Вывод:
['данные', '"данные', ' внутри которых есть запятая"', '"в этих ""данных', ' есть и запятая"" и кавычки"']

Если брать в том виде, что у вас, то при присвоении текста в переменную это будет кортеж. И таким образом, ничего в коде не измениться, а всего лишь надо убрать скобки.

→ Ссылка
Автор решения: extrn

Если из текста убрать пробелы после разделяющих запятых, получится вполне себе формат csv "стандартного" диалекта.

import csv
import io

text = 'данные,"данные, внутри которых есть запятая","в этих ""данных, есть и запятая"" и кавычки"'

with io.StringIO(text) as f:
    reader = csv.reader(f)

    for row in reader:
        print(row)
        break
['данные', 'данные, внутри которых есть запятая', 'в этих "данных, есть и запятая" и кавычки']
→ Ссылка
Автор решения: Stanislav Volodarskiy

Регулярное выражение , |" ищет в строке кавычки и разделители. Флаг quoted означает "в кавычках", его надо переворачивать каждый раз когда видим кавычку. Если флаг сброшен и нашлась запятая её координаты складываются в список разрезов - cuts. В начало списка вставлен разрез в начале строки, в конец списка добавляется конец строки. В списке разрезов чётное число элементов. Каждая последовательная пара элементов указывает кусок текста, который попадёт в ответ:

import re


text = 'данные, "данные, внутри которых есть запятая", "в этих ""данных, есть и запятая"" и кавычки"'

print(text)
cuts = [0]
quoted = False
for m in re.finditer(', |"', text):
    if m.group(0) == '"':
        quoted = not quoted
        print('quote', m.span(), quoted)
    elif not quoted:
        cuts.extend(m.span())
        print('unquoted comma', m.span())
cuts.append(len(text))
print("cuts", cuts)

it = iter(cuts)
for f, t in zip(it, it):
    print(f, t, text[f:t])
$ python parse.py
данные, "данные, внутри которых есть запятая", "в этих ""данных, есть и запятая"" и кавычки"
unquoted comma (6, 8)
quote (8, 9) True
quote (44, 45) False
unquoted comma (45, 47)
quote (47, 48) True
quote (55, 56) False
quote (56, 57) True
quote (79, 80) False
quote (80, 81) True
quote (91, 92) False
cuts [0, 6, 8, 45, 47, 92]
0 6 данные
8 45 "данные, внутри которых есть запятая"
47 92 "в этих ""данных, есть и запятая"" и кавычки"
→ Ссылка