簡體   English   中英

使用Python導入CSV; 不正確的“,”分隔符行為

[英]CSV import with Python; incorrect “,” delimiter behavior

我以下面的方式使用csv模塊

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])

提前致謝。

csv.reader()可以處理任何iterable ,並期望每次迭代超過該iterable產生一個完整的行 iterable可以是類似文件的對象,或者(通常)是字符串列表

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

如果傳入一個字符串對象,則字符串本身會被迭代,就像每個字符都是一行一樣,但由於引號, csv將繼續讀取“lines”,直到找到一個結束引號字符。

下一個“行” 包含一個逗號,因此被視為兩個空值的行。

或者,以前5個字符( "Id", )為例, csv這樣做:

  • 迭代並接收" 。這是一個帶引號的值,因此請包括行末之前的所有內容。
  • 有一個開始的引號,迭代直到找到一個結束的引號,直到該點的所有內容都附加到現有值之后。
    • 循環並接收I ,追加。
    • 循環並接收d ,追加。
    • 循環並接收" 。引用關閉,產生一個完整的行['Id']
  • 迭代和接受, 這是一個帶分隔符的完整行,因此產生['', '']

每當我需要將字符串值傳遞給csv.reader()我使用str.splitlines() ; 此方法將始終返回一個列表,因此這適用於沒有換行符的行:

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

我留在換行符中(將True傳遞給str.splitlines() ;然后使用包含換行符正確返回帶換行符的引用值。

您應該將類​​似文件的對象(或任何其他可迭代的對象)作為第一個參數傳遞給csv.reader

csv.reader(csvfile,dialect ='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']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM