CSV全稱為“Comma Separated Values”,是一種格式化的檔案,由行和列組成,分隔字元可以根據需要來變化。
如下面為一csv檔案:
Title,Release Date,DirectorAnd Now For Something Completely Different,1971,Ian MacNaughtonMonty Python And The Holy Grail,1975,Terry Gilliam and Terry JonesMonty Python's Life Of Brian,1979,Terry JonesMonty Python Live At The Hollywood Bowl,1982,Terry HughesMonty Python's The Meaning Of Life,1983,Terry Jones
csv可以比較方便的在不同應用之間遷移資料。可以將資料大量匯出為csv格式,然後倒入到其他應用程式中。很多應用中需要匯出報表,也通常用csv格式匯出,然後用Excel工具進行後續編輯。
列印發行日期及標題,逐行處理:
for line in open("samples/sample.csv"): title, year, director = line.split(",") print year, title
使用csv模組處理:
import csvreader = csv.reader(open("samples/sample.csv"))for title, year, director in reader: print year, title
改變分隔字元
建立一csv.excel的子類,並修改分隔字元為”;”
# File: csv-example-2.pyimport csvclass SKV(csv.excel): # like excel, but uses semicolons delimiter = ";" csv.register_dialect("SKV", SKV)reader = csv.reader(open("samples/sample.skv"), "SKV")for title, year, director in reader: print year, title
如果僅僅僅是改變一兩個參數,則可以直接在reader參數中設定,如下:
# File: csv-example-3.py import csv reader = csv.reader(open("samples/sample.skv"), delimiter=";") for title, year, director in reader: print year, title
將資料存為CSV格式
通過csv.writer來產生一csv檔案。
# File: csv-example-4.py import csvimport sys data = [ ("And Now For Something Completely Different", 1971, "Ian MacNaughton"), ("Monty Python And The Holy Grail", 1975, "Terry Gilliam, Terry Jones"), ("Monty Python's Life Of Brian", 1979, "Terry Jones"), ("Monty Python Live At The Hollywood Bowl", 1982, "Terry Hughes"), ("Monty Python's The Meaning Of Life", 1983, "Terry Jones")] writer = csv.writer(sys.stdout) for item in data: writer.writerow(item)
執行個體
下面我們來看一個比較完整的例子,代碼說明在注釋中:
import csv# dialect是訪問csv檔案時需要指定的參數之一,用來確定csv檔案的資料格式# 下面這個函數列舉系統支援的dialect有哪些,預設值是'excel',使用者也可# 以從Dialect派生一個類,使用該類的執行個體作為dialect參數。print csv.list_dialects()def test_writer(): # csv檔案必須以二進位方式open with open('eggs.csv', 'wb') as csvfile: spamwriter = csv.writer(csvfile) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])def test_reader(): with open('eggs.csv', 'rb') as csvfile: spamreader = csv.reader(csvfile) for row in spamreader: print row# sniffer 用來推斷csv檔案的格式,不是很準確def test_sniffer(): with open('eggs.csv', 'wb') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ') spamwriter.writerow(['Spam'] * 2 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) # 通常你需要指定與寫入者相同的檔案格式才能正確的讀取資料 with open('eggs.csv', 'rb') as csvfile: spamreader = csv.reader(csvfile, delimiter=' ') for row in spamreader: print ', '.join(row) # 如果不知道檔案格式,sniffer就可以派上用場了 with open('eggs.csv', 'rb') as csvfile: # 用sniffer推斷檔案格式,從而得到dialect dialect = csv.Sniffer().sniff(csvfile.read(1024)) print dialect.delimiter, dialect.quotechar # 檔案重新移動到頭部 csvfile.seek(0) # 用推斷出來的dialect建立reader reader = csv.reader(csvfile, dialect) for row in reader: print ', '.join(row)