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

#python #csv

#python #csv

Вопрос:

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

 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 может быть похоже

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

Комментарии:

1. Прочитайте файл по строке за раз (без разделителя) и посмотрите на одну из функций регулярных выражений python с более расширенными возможностями для разделения строки на поля

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

3. есть ли у вас контроль над созданием входного файла csv или вы вынуждены иметь дело со сломанными файлами csv? обычно люди используют quotechar='"'

Ответ №1:

CSV — это именно то, что: «Разделено запятыми». Вам либо нужно заключить поле name в кавычки:

 |name,item_det|
  

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

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

Пример:

 name,item_det
  

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

Ответ №2:

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