Подтвердить что ты не робот

Почему читатель 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.

Спасибо!

4b9b3361

Ответ 1

Если вы посмотрите на диалект, который вы используете, вы заметите, что диалект 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

Ответ 2

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

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

против

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

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