Чтение из CSV-файла Python

1

Я пытаюсь решить эту проблему. Я читаю данные из csv fiile, который имеет следующие столбцы:

id, name, price

Поэтому я использую следующий код для чтения csv:

import sys
import csv as input

def readFile(path):
    try:
        finput = input.reader(open(path,'rb'),delimiter=',',quotechar='|')
    except IOError as (errno,strerror):
            print "I/O error({0}): {1}".format(errno,strerror)
    except:
            print "Unexpected Error: ",sys.exc_info()[0]
            raise
    # covert format into list
    fmod = list(finput)
    return fmod

но проблема в том, что поле имени может быть похоже

name, item_det теперь, что "," создает для меня проблему.. вместо чтения поля имени как единого объекта, имеющего запятую в описании. он разделяет это конкретное поле. Как я могу это решить. благодаря

  • 2
    Читайте файл по очереди за раз (без разделителя) и посмотрите на одну из функций регулярных выражений python с более продвинутыми функциями для разделения строки на поля
  • 3
    Обычно ваш CSV-файл будет содержать кавычки, так что строка будет |name, item_det|, other_field, another_field (поскольку вы устанавливаете quotechar='|' ). Модуль CSV может справиться с этим. Если нет, вы, вероятно, захотите сделать, как сказал @MartinBeckett, и проанализировать его вручную, или проверить длину списка и объединить эти два поля вручную, если это необходимо.
Показать ещё 1 комментарий
Теги:
csv

2 ответа

1
Лучший ответ

CSV - это то, что: "Comma Separated". Вам нужно указать поле имени:

|name,item_det|

Или используйте escape-символ, но вам нужно включить его, установив для него значение QUOTE_NONE:

reader = csv.reader(open(path, "rb"), delimiter=',', quoting=csv.QUOTE_NONE, escapechar="\\")

Пример:

name\,item_det

В противном случае не используйте модуль csv.

1

Просто убедитесь, что любые одиночные значения, содержащие ваш разделитель char (,), заключены в quotechar (| в вашем примере). Таким образом, в любое время, когда поле name в строке имеет вид <name>, <item_det> строка должна читать что-то вроде ... ,|<name>, <item_det>|,...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню