Как отключить цитирование в Python 2.4 CSV-ридере?

Я пишу утилиту Python, которая должна анализировать большой, регулярно обновляемый CSV-файл, который я не контролирую. Утилита должна запускаться на сервере с доступным только Python 2.4. CSV-файл вообще не цитирует значения полей, но версия библиотеки csv версии Python 2.4, похоже, не дает мне возможности отключить цитирование, это просто позволяет мне установить символ кавычки ( dialect.quotechar = '"' или что-то еще) .Если я попытаюсь установить символ кавычки на None или пустую строку, я получаю сообщение об ошибке.

Я могу как-то разобраться в этом, установив dialect.quotechar на какой-то «редкий» характер, но это хрупкое, так как нет символа ASCII, который я могу абсолютно гарантировать, не будет отображаться в значениях поля (кроме разделителя, но если я установил dialect.quotechar = dialect.delimiter , вещи идут предсказуемо haywire).

В Python 2.5 и более поздних версиях , если я устанавливаю dialect.quoting в csv.QUOTE_NONE , читатель CSV уважает это и не интерпретирует ни одного символа в качестве символа кавычки. Есть ли способ дублировать это поведение в Python 2.4?

ОБНОВЛЕНИЕ : Спасибо Триптих и Марк Родди за то, что они помогли сузить проблему. Вот простейшая демонстрация:

 >>> import csv >>> import StringIO >>> data = """ ... 1,2,3,4,"5 ... 1,2,3,4,5 ... """ >>> reader = csv.reader(StringIO.StringIO(data)) >>> for i in reader: print i ... [] Traceback (most recent call last): File "<stdin>", line 1, in ? _csv.Error: newline inside string 

Проблема возникает только тогда, когда в последнем столбце строки есть один символ двойной кавычки. К сожалению, эта ситуация существует в моем наборе данных. Я принял решение Tanj: вручную назначить непечатаемый символ ( "\x07" или BEL ) как катчар. Это хаки, но это работает, и я еще не видел другого решения. Вот демонстрация решения в действии:

 >>> import csv >>> import StringIO >>> class MyDialect(csv.Dialect): ... quotechar = '\x07' ... delimiter = ',' ... lineterminator = '\n' ... doublequote = False ... skipinitialspace = False ... quoting = csv.QUOTE_NONE ... escapechar = '\\' ... >>> dialect = MyDialect() >>> data = """ ... 1,2,3,4,"5 ... 1,2,3,4,5 ... """ >>> reader = csv.reader(StringIO.StringIO(data), dialect=dialect) >>> for i in reader: print i ... [] ['1', '2', '3', '4', '"5'] ['1', '2', '3', '4', '5'] 

В Python 2.5+ достаточно quotechar значение quotechar , и значение quotechar тогда будет неактуальным. (Я на самом деле получаю свой первоначальный диалект через csv.Sniffer а затем переопределяя значение катчара, а не подклассированием csv.Dialect , но я не хочу, чтобы это было отвлечение от реальной проблемы, эти две сессии демонстрируют, что Sniffer – не проблема.)

  • Отладчик Python работает в генераторах?
  • Как красиво печатать numpy.array без научной нотации и с заданной точностью?
  • Удаление неиспользуемых пакетов из файла требований
  • Как генерировать случайные числа, которые отличаются?
  • Очистить текст от textarea с селеном
  • Эффективный анализатор грамматики без контекста, предпочтительно Python-friendly
  • Как сохранить файлы cookie (python) в файл?
  • Лучший способ доступа к N-й строке файла csv
  • 3 Solutions collect form web for “Как отключить цитирование в Python 2.4 CSV-ридере?”

    Я не знаю, хотел бы ли python / разрешить его, но вы могли бы использовать непечатаемый код ascii, такой как BEL или BS (backspace). Я думаю, что это будет крайне редко.

    Я попробовал несколько примеров с использованием Python 2.4.3, и он казался достаточно умным, чтобы обнаружить, что поля были не отсортированы.

    Я знаю, что вы уже приняли (слегка хакерский) ответ, но попробовали ли вы просто оставить значение reader.dialect.quotechar одиночку? Что произойдет, если вы это сделаете?

    Любой шанс, что мы могли бы получить пример ввода?

    +1 для Триптиха

    Подтверждение того, что csv.reader автоматически обрабатывает файлы csv без кавычек:

     >>> import StringIO >>> import csv >>> data=""" ... 1,2,3,4,5 ... 1,2,3,4,5 ... 1,2,3,4,5 ... """ >>> reader=csv.reader(StringIO.StringIO(data)) >>> for i in reader: ... print i ... [] ['1', '2', '3', '4', '5'] ['1', '2', '3', '4', '5'] ['1', '2', '3', '4', '5'] 
    Python - лучший язык программирования в мире.