Я хотел бы расширить приведенный ниже код, чтобы он мог принимать двойные кавычки. Например, строка '303,"Candy, Original",45,19'
должна возвращать [303,"Candy, Original",45,19]
. Пожалуйста помоги. Спасибо.
def parse(s):
#If string can be parsed as integer, return integer
try:
num = int(s)
return num
except:
pass
#Else return string
return s
data=[parse(x) for x in myString.split(",")]
Возможный дубликат Строка csv Python в массив
csv
, вероятно, может справиться с этой ситуацией, см. этот вопрос ранее о том, как обрабатывать разделители в кавычках с этим модулем. но нам нужно увидеть лучший минимальный воспроизводимый пример вашего кода и примеров ввода.
@DavidZemens: Вы представили " "
вместо оригинала ' '
@ Шелдор, ты прав! ¯_(ツ)_/¯
Модуль csv
очень хорошо обрабатывает запятые в кавычках. Вы можете попробовать построить парсер вокруг этого.
import csv
from io import StringIO
def to_numeric(x):
try:
return int(x)
except ValueError:
pass
try:
return float(x)
except ValueError:
pass
return x
def parse_line(s):
f = StringIO(s)
f.seek(0)
reader = csv.reader(f)
out = next(reader)
return [to_numeric(x) for x in out]
s = '303,"Candy, Original",45,19'
parse_line(s)
# returns:
[303, 'Candy, Original', 45, 19]
Решение с использованием CSV:
$ python
Python 3.7.2 (default, Dec 27 2018, 07:35:06)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import csv
>>> from io import StringIO
>>> csv_string = '303,"Candy, Original",45,19'
>>> csv_file = StringIO(csv_string)
>>>
>>> reader = csv.reader(csv_file, delimiter=',')
>>> reader.__next__()
['303', 'Candy, Original', '45', '19']
Затем вы можете передать каждое значение через принуждение int
или float
, чтобы получить собственные числовые значения, если это необходимо.
Похоже, что модуль
csv
должен справиться с этим.