2013-09-06 4 views
2

Я использую модуль CSV следующим образомИмпорт CSV с Python; неправильно "" поведение разделителем

header = '"Id","IsDeleted","MasterRecordId","Salutation","FirstName","LastName","Name","Type","RecordTypeId","ParentId","BillingStreet","BillingCity","BillingState","BillingPostalCode","BillingCountry","BillingLatitude"' 
header_c = csv.reader(header, delimiter=',', quotechar='"') 

names = [] 
for row in header_c: 
    names.append(row) 

инспектирующих имена возвращает:

[['Id'], ['', ''], ['IsDeleted'], ['', ''], ['MasterRecordId'], ['', ''], ['Salutation'], ['', ''], ['FirstName'], ['', ''], ['LastName'], ['', ''], ['Name'], ['', ''], ['Type'], ['', ''], ['RecordTypeId'], ['', ''], ['ParentId'], ['', ''], ['BillingStreet'], ['', ''], ['BillingCity'], ['', ''], ['BillingState'], ['', ''], ['BillingPostalCode'], ['', ''], ['BillingCountry'], ['', ''], ['BillingLatitude']] 

я мог игнорировать все нечетные элементы, сохраняя 0, 2, 4 , ...., но я не понимаю, что я делаю неправильно, и почему запятые сохраняются как записи. Что мне нужно изменить, чтобы запятая была удалена. «IsDeleted» - вторая запись (имена [1])

Заранее спасибо.

ответ

3

csv.reader() может обрабатывать любые итерацию, и ожидает, что каждая итерация по этой итерации приведет к полной линии . Итератора может быть файл-подобный объект, или (обычно) а список строк:

header_c = csv.reader([header], delimiter=',', quotechar='"') 

Если вы передаете в только один объект строка, сама строка повторяется через, как если бы каждый символ была линией, но из-за котировок csv будет продолжать читать строки, пока не найдет символ закрывающего кавычки.

Следующая «строки» содержит только запятую, так что рассматриваются как линия два пустых значений.

Или возьмем первые 5 символов ("Id",) в качестве примера, csv делает это:

  • итерацию и получить ". Это значение в кавычках, поэтому включите все до конца строки.
  • Существует открытая цитата, итерация до тех пор, пока не будет найдена закрывающая цитата, все до тех пор, пока эта точка не будет добавлена ​​к существующему значению.
    • петля и прием I, прилагается.
    • петля и прием d, добавьте.
    • петля и прием ". Цитата закрыта, дайте полный ряд ['Id'].
  • Итерация и прием ,. Это полная строка с разделителем, поэтому введите ['', ''].

Всякий раз, когда мне нужно передать строковое значение csv.reader(), я использую str.splitlines(); этот метод всегда возвращает список, так что это работает для линий без символов новой строки тоже:

header_c = csv.reader(header.splitlines(True), delimiter=',', quotechar='"') 

Я оставляю в новой строкой (пропуск в True к str.splitlines(), приведенные значения с символом новой строки, затем должным образом возвращаются с новой строкой включены

3

Вы должны передать файл-подобный объект (или любой другой итерабельный) в csv.reader в качестве первого параметра.

csv.reader (csvfile, говор = '', Excel ** fmtparams)

Вернуть объект читателя, который будет перебирать строки в данной csvfile. csvfile может быть любым объектом, который поддерживает протокол итератора и возвращает строку каждый раз при вызове метода next() - Объекты файлов и объекты списка подходят.

Один из вариантов, чтобы прочитать строку в буфер StringIO:

from StringIO import StringIO 
header_c = csv.reader(StringIO(header), delimiter=',', quotechar='"') 

Затем, в именах, вы получите:

[['Id', 'IsDeleted', 'MasterRecordId', 'Salutation', 'FirstName', 'LastName', 'Name', 'Type', 'RecordTypeId', 'ParentId', 'BillingStreet', 'BillingCity', 'BillingState', 'BillingPostalCode', 'BillingCountry', 'BillingLatitude']] 
+0

Это что-то не так. Любые комментарии к тому, что происходит за кулисами? – artdv

+0

'header_c = csv.reader ([header], delimiter = ',', quotechar = '"') 'также работает. –

+0

@artdv please см. ответ Мартиня. Он очень хорошо объяснил всю историю. – alecxe

Смежные вопросы