Python STL csv

來源:互聯網
上載者:User

標籤:mes   檔案   標準庫   off   定義   ros   推導   div   欄位   

作用:讀寫逗點分隔值檔案。

Python版本:2.3及以後版本

可以用csv模組處理從試算表和資料庫匯出的資料,並寫入採用欄位和記錄格式的文本 檔案,這種格式通常稱為逗號分隔值(comma-separated value, CSV)格式,因為常用逗號來 分隔記錄中的欄位。

讀檔案

可以使用reader建立一個對象從CSV檔案讀取資料。這個閱讀器可以用作一個迭代器,按順序處理檔案中的行例如:

import csvwith open("testdata.csv", 'rt') as f:    reader = csv.reader(f)    for row in reader:        print row

reader()的第一個參數是文本行的源。在這個例子中,這是一個檔案,不過也可以是任何可迭代的對象(如StringIO執行個體、list等等)。還可以指定其他選擇性參數,來控制如何解析輸入資料。

"Title 1","Title 2","Title 3"1,"a",08/18/072,"b",08/19/073,"c",08/20/07

讀檔案時,輸入資料的每一行都會解析,並轉換為一個字串list。

['Title 1', 'Title 2', 'Title 3']['1', 'a', '08/18/07']['2', 'b', '08/19/07']['3', 'c', '08/20/07'][Finished in 0.1s]

這個解析器會處理嵌在行字串中的分行符號,正是因為這個原因,這裡的“行”(row)並 不一定等同於檔案的一個輸入“行”(line)。

寫檔案

寫CSV檔案與讀CSV檔案同樣容易。可以使用writer建立一個對象來寫資料,然後使用writerow迭代處理文本行進行列印。

import csvwith open("testout.csv", 'wt') as f:    writer = csv.writer(f)    writer.writerow( ('Title 1', 'Title 2', 'Title 3') )    for i in range(3):        writer.writerow( (i+1,                          chr(ord('a') + i),                          '08/%02d/07' % (i+1),                          )                         )print open("testout.csv", 'rt').read()

這裡的輸出與閱讀器樣本中使用的匯出資料看上去不完全相同。

Title 1,Title 2,Title 31,a,08/01/072,b,08/02/073,c,08/03/07[Finished in 0.1s]
引號

對於書寫器,預設的引號行為有所不同,所以前例中第2列和第3列沒有加引號。要加引號,需要將quoting參數設定為另外某種引號模式。

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)

在這裡,QUOTE_NONNUMERIC會在所有包含非數值內容的列周圍加引號

import csvwith open("testout_quoted.csv", 'wt') as f:    writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)    writer.writerow( ('Title 1', 'Title 2', 'Title 3') )    for i in range(3):        writer.writerow( (i+1, chr(ord('a') + i), '08/%02d/07' % (i+1)) )print open("testout_quoted.csv", 'rt').read()

運行結果:

"Title 1","Title 2","Title 3"1,"a","08/01/07"2,"b","08/02/07"3,"c","08/03/07"[Finished in 0.1s]

有4種不同的引號選項,在csv模組中定義為4個常量。

  • QUOTE_ALL

不論類型是什麼,對所有欄位都加引號。

  • QUOTE_MINIMAL

對包含特殊字元的欄位加引號(所謂特殊字元是指,對於一個用相同方言和選項配置的解析器,可能會造成混淆的字元)。這是預設選項

  • QUOTE_NO_MERIC

對所有非整數或浮點數的欄位加引號。在閱讀器中使用時,不加引號的輸入欄位會轉換為浮點數。

  • QUOTE_NONE

輸出中所有內容都不加引號。在閱讀器中使用時,引號字元包含在欄位值中(正常情況下,它們會處理為定界符並去除)。

方言

逗點分隔值檔案沒有明確定義的標準,所以解析器必須很靈活。這種靈活性意味著可以用很多參數來控制CSV如何解析或寫資料。並不是將各個參數單獨傳入閱讀器和書寫器,可以把它們成組在一起構成一個方言dialect對象。

Dialect類可以按名註冊,這樣CSV槙塊的調用者就不需要提前知道參數設定。可以用list_ dialects。擷取完整的登入方言列表。

import csvprint csv.list_dialects ()

這個標準庫包括兩個方言:excel和excel-tabs。excel方言用於處理採用Microsoft Excel預設匯出格式的資料,也可以處理OpenOffice或NeoOffice。

['excel-tab', 'excel'][Finished in 0.1s]
建立方言

可以不使用逗號來分隔宇段,輸入檔案使用了豎線(|),如下所示:

"Title 1"|"Title 2"|"Title 3"1|"first linesecond line"|08/18/07

可以使用適當的定界符註冊一個新的方言。

import csvcsv.register_dialect('pipes', delimiter='|')with open('testdata.pipes', 'r') as f:    reader = csv.reader(f, dialect='pipes')    for row in reader:        print row

使用“pipes”方言,可以像逗號定界檔案一樣讀取檔案。

['Title 1', 'Title 2', 'Title 3']['1', 'first line\nsecond line', '08/18/07'][Finished in 0.1s]

其他參數可以查看協助進行。

欄位名

除了處理資料序列,CSV模組還包括一些類,可以將行作為字典來處理,從而可以對欄位命名。DictReader和DictWriter類將行轉換為字典而不是列表。字典的鍵可以傳入,也可以由輸入的第一行推導得出(如果行包含首部)。

import csvwith open("testdata.csv", 'rt') as f:    reader = csv.DictReader(f)    for row in reader:        print row

基於字典的閱讀器和書寫器會實現為基於序列的類的封裝器,它們使用相同的方法和參數。閱讀器API中惟一的差別是:行將作為字典返回,而不是作為列表或元組。

{'Title 1': '1', 'Title 3': '08/18/07', 'Title 2': 'a'}{'Title 1': '2', 'Title 3': '08/19/07', 'Title 2': 'b'}{'Title 1': '3', 'Title 3': '08/20/07', 'Title 2': 'c'}[Finished in 0.1s]

必須為DictWriter提供一個欄位名列表,使它知道如何在輸出中確定列的順序.

import csvwith open("testout.csv", 'wt') as f:    fieldnames = ('Title 1', 'Title 2', 'Title 3')    headers = dict( (n,n) for n in fieldnames )    writer = csv.DictWriter(f, fieldnames=fieldnames)    writer.writerow(headers)    for i in range(3):        writer.writerow({ 'Title 1':i+1,                          'Title 2':chr(ord('a') + i),                          'Title 3':'08/%02d/07' % (i+1),                          })print open("testout.csv", 'rt').read()

欄位名並不自動寫至檔案,所以需要在寫其他資料之前顯式寫出。

Title 1,Title 2,Title 31,a,08/01/072,b,08/02/073,c,08/03/07[Finished in 0.1s]

Python STL csv

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.