#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>|, ...
.