標籤: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個常量。
不論類型是什麼,對所有欄位都加引號。
對包含特殊字元的欄位加引號(所謂特殊字元是指,對於一個用相同方言和選項配置的解析器,可能會造成混淆的字元)。這是預設選項
對所有非整數或浮點數的欄位加引號。在閱讀器中使用時,不加引號的輸入欄位會轉換為浮點數。
輸出中所有內容都不加引號。在閱讀器中使用時,引號字元包含在欄位值中(正常情況下,它們會處理為定界符並去除)。
方言
逗點分隔值檔案沒有明確定義的標準,所以解析器必須很靈活。這種靈活性意味著可以用很多參數來控制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