Python преобразовать строку в список по разделителю
Как в Python преобразовать строку в список по разделителю "," Если внутри части строки есть запятая, то эта часть строки выделяется двойными кавычки
Например, строку:
данные, "данные, внутри которых есть запятая", "в этих ""данных, есть и запятая"" и кавычки"
преобразовать в список:
['данные', '"данные, внутри которых есть запятая"', '"в этих ""данных, есть и запятая"" и кавычки"']
Ответы (3 шт):
Можно вот так вот попробовать:
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)
Вывод:
['данные', '"данные', ' внутри которых есть запятая"', '"в этих ""данных', ' есть и запятая"" и кавычки"']
Если брать в том виде, что у вас, то при присвоении текста в переменную это будет кортеж. И таким образом, ничего в коде не измениться, а всего лишь надо убрать скобки.
Если из текста убрать пробелы после разделяющих запятых, получится вполне себе формат csv "стандартного" диалекта.
import csv
import io
text = 'данные,"данные, внутри которых есть запятая","в этих ""данных, есть и запятая"" и кавычки"'
with io.StringIO(text) as f:
reader = csv.reader(f)
for row in reader:
print(row)
break
['данные', 'данные, внутри которых есть запятая', 'в этих "данных, есть и запятая" и кавычки']
Регулярное выражение , |" ищет в строке кавычки и разделители. Флаг 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 "в этих ""данных, есть и запятая"" и кавычки"