Может ли читатель csv python оставить кавычки?
Я хочу использовать Python CSV reader, но я хочу оставить кавычки. То есть я хочу:
>>> s = '"simple|split"|test'
>>> reader = csv.reader([s], delimiter='|', skipinitialspace=True)
>>> reader.next()
['"simple|split"', 'test']
но я действительно получаю:
['simple|split', 'test']
в моем случае я хочу, чтобы цитируемая строка была передана по-прежнему цитируемой.
Я знаю, что читатель CSV работает по назначению, и мой вариант использования-это злоупотребление им, но есть ли способ согнуть его по моей воле? Или мне нужно написать свой собственный парсер строк?
2 ответов
вам придется написать свой собственный парсер, так как часть модуля, которая поддерживает синтаксический анализ и кавычки, находится на стороне C, в частности parse_process_char
расположенном в Modules/_csv.c
:
else if (c == dialect->quotechar &&
dialect->quoting != QUOTE_NONE) {
if (dialect->doublequote) {
/* doublequote; " represented by "" */
self->state = QUOTE_IN_QUOTED_FIELD;
}
else {
/* end of quote part of field */
self->state = IN_FIELD;
}
}
else {
/* normal character - save in field */
if (parse_add_char(self, c) < 0)
return -1;
}
этот раздел "конец цитаты части поля" - это то, что грызет вашу двойную цитату. С другой стороны, вы могли бы убить, что else
условный и перестроить исходный код python. Однако это не все, что можно поддерживать, чтобы быть честным.
редактировать: Извините, я имел в виду добавить бит из последнего else
до self->state = IN_FIELD
таким образом, он добавляет цитату.
Я не понимаю, есть ли у вас четкое представление о том, что вы пытаетесь получить.
Ты говоришь "Я знаю (...) мой случай использования-это злоупотребление" .
Но злоупотребление подразумевает, что существует возможность использования.
Однако в вашем случае нет возможности использовать то, что вы" описали", невозможно, потому что то, что передается парсеру CSV, должно иметь допустимый формат CSV, а ваш-нет.
в допустимой строке CSV большинство символов являются информацией, а некоторые символы-это метаинформация, необходимая для интерпретации строки для извлечения информации.
То, что вы описали, что вы хотите, что символы "
должны быть в информационной категории и категории метаинформации в целом. Это похоже на то, как кто-то хочет поймать свою левую руку левой рукой.....
эта проблема возникает с вашей строкой, потому что это не строка, исходящая из чтения файла CSV. Это строка, написанная как есть.
Это невозможно получить такую строку из чтения CSV-файла, потому что она не могла быть написана так в CSV-файле.
Если записано в файл CSV,'"simple|split"|test'
может быть написано
"""simple|split"""|test
сdoublequote
значение True, значение по умолчаниюили
#"simple#|split#"|test
сdoublequote = False, escapechar = '#'
.
если вы хотите извлечь информацию, как вы описали, у вас не создайте парсер, вам нужно просто использовать уже существующий инструмент:
import re
reg = re.compile('".*?"|[^|]+')
print reg.findall('yoo|"simple|split"|test|end"pos|hu')
результат
['yoo', '"simple|split"', 'test', 'end"pos', 'hu']