Почему программа чтения Python CSV игнорирует поля в двойных кавычках?

Я думаю, что это, вероятно, что-то простое, но после часа поиска мне не удалось понять, что я делаю неправильно.

Я использую следующий код для чтения файла CSV. У меня нет проблем с чтением файла, но когда строка содержит поле, заключенное в двойные кавычки, поскольку оно содержит разделитель, программа чтения CSV игнорирует двойные кавычки и анализирует поле на 2 отдельных поля.

Вот код, который я использую:

myReader = csv.reader(open(inPath, 'r'), dialect='excel', delimiter=',', quotechar='"')
for row in myReader:
    print row,
    print len(row)

Мой вклад:

hello, this is row 1, foo1
hello, this is row 2, foo2
goodbye, "this, is row 3", foo3

Что дает мне:

['hello', ' this is row 1', ' foo1'] 3
['hello', ' this is row 2', ' foo2'] 3
['goodbye', ' "this', ' is row 3"', ' foo3'] 4

Что мне нужно изменить, чтобы он распознавал поле с двойными кавычками как одно поле? Я использую Python версии 2.6.1.

Спасибо!


person jamz    schedule 29.07.2011    source источник


Ответы (2)


Если вы посмотрите на диалект, который вы используете, вы заметите, что диалект Excel настроен следующим образом:

class excel(Dialect):
    """Describe the usual properties of Excel-generated CSV files."""
    delimiter = ','
    quotechar = '"'
    doublequote = True
    skipinitialspace = False
    lineterminator = '\r\n'
    quoting = QUOTE_MINIMAL

Обратите внимание, что для skipinitialspace установлено значение False. Просто передайте это вашему читателю. Да, и, кстати, все поля, которые вы передали, уже являются значениями по умолчанию при использовании диалекта excel, который является параметром диалекта по умолчанию, передаваемым в csv.reader

Итак, я бы переписал ваш код так:

>>> with open(inPath) as fp:
>>>     reader = csv.reader(fp, skipinitialspace=True)
>>>     for row in reader:
>>>         print row,
>>>         print len(row)
['hello', 'this is row 1', 'foo1'] 3
['hello', 'this is row 2', 'foo2'] 3
['goodbye', 'this, is row 3', 'foo3'] 3
person Mahmoud Abdelkader    schedule 29.07.2011

Это потому, что в вашем csv есть пробелы перед кавычками:

one0, one1, one2
two0, two1, two2
tre0, "tr,e1", tre2

vs

one0,one1,one2
two0,two1,two2
tre0,"tr,e1",tre2

Сначала вам нужно удалить эти лишние пробелы.

person TorelTwiddler    schedule 29.07.2011
comment
Это неправильно: csv.reader() имеет опцию skipinitialspace для работы с этими пробелами. - person MERose; 25.05.2016