Может ли читатель 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']