# -*- coding:utf-8 -*- ''' CSV 常用API 1)reader(csvfile[, dialect='excel'][, fmtparam]),主要用於CSV 文件的讀取,返回一個 reader 對象用於在CSV 文件內容上進行行迭代。 參數: csvfile,需要是支持迭代(Iterator)的對象,通常對文件(file)對象或者列表(list)對象都是適用的,並且每次調用next() 方法的返回值是字符串(string); dialect 的默認值為excel,與excel 兼容; fmtparam 是一系列參數列表,主要用於需要覆蓋默認的Dialect設置的情形 2)csv.writer(csvfile, dialect='excel', **fmtparams),用於寫入CSV 文件。 with open('data.csv', 'wb') as csvfile: csvwriter = csv.writer(csvfile, dialect='excel',delimiter="|",quotechar='"', quoting=csv.QUOTE_MINIMAL) csvwriter .writerow(["1/3/09 14:44","'Product1'","1200''","Visa","Gouya"]) # 寫入行 輸出形式為: 1/3/09 14:44|'Product1'|1200''|Visa|Gouya 3)csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel',*args, **kwds),同reader() 方法類似,不同的是將讀入的信息映射到一個字典中去,其中字 典的key 由fieldnames 指定,該值省略的話將使用CSV 文件第一行的數據作為key 值。如果 讀入行的字段的個數大於filednames 中指定的個數,多余的字段名將會存放在restkey 中,而 restval 主要用於當讀取行的域的個數小於fieldnames 的時候,它的值將會被用作剩下的key對應的值。 4)csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args,**kwds),用於支持字典的寫入。 ''' import csv #DictWriter with open('C:\\test.csv', 'wb') as csv_file: # 設置列名稱 FIELDS = ['Transaction_date', 'Product', 'Price', 'Payment_Type'] writer = csv.DictWriter(csv_file, fieldnames=FIELDS) # 寫入列名稱 writer.writerow(dict(zip(FIELDS, FIELDS))) d = {'Transaction_date':'1/2/09 6:17','Product':'Product1','Price':'1200',\ 'Payment_Type':'Mastercard'} # 寫入一行 writer.writerow(d) with open('C:\\test.csv', 'rb') as csv_file: for d in csv.DictReader(csv_file): print d ''' Pandas 即Python Data Analysis Library,是為了解決數據分析而創建的第三方工具,,它 不僅提供了豐富的數據模型,而且支持多種文件格式處理,包括CSV、HDF5、HTML 等, 能夠提供高效的大型數據處理。其支持的兩種數據結構——Series 和DataFrame——是數據處 理的基礎。下面先來介紹這兩種數據結構。 Series:它是一種類似數組的帶索引的一維數據結構,支持的類型與NumPy 兼容。如 果不指定索引,默認為0 到N-1。通過obj.values() 和obj.index() 可以分別獲取值和索 引。當給Series 傳遞一個字典的時候,Series 的索引將根據字典中的鍵排序。如果傳 入字典的時候同時重新指定了index 參數,當index 與字典中的鍵不匹配的時候,會 出現時數據丟失的情況,標記為NaN。 import pandas #在pandas 中用函數isnull() 和notnull() 來檢測數據是否丟失。 >>> obj1 = Series([1, 'a', (1,2), 3], index=['a', 'b', 'c', 'd']) >>> obj1#value 和index 一一匹配 a 1 b a c (1, 2) d 3 dtype: object >>> obj2=Series({"Book":"Python","Author":"Dan","ISBN":"011334","Price":25},inde x=['book','Author','ISBM','Price']) >>> obj2.isnull() book True # 指定的index 與字典的鍵不匹配,發生數據丟失 Author False ISBM True # 指定的index 與字典的鍵不匹配,發生數據丟失 Price False dtype: bool DataFrame :類似於電子表格,其數據為排好序的數據列的集合,每一列都可以是 不同的數據類型,它類似於一個二維數據結構,支持行和列的索引。和Series 一 樣,索引會自動分配並且能根據指定的列進行排序。使用最多的方式是通過一個長 度相等的列表的字典來構建。構建一個DataFrame 最常用的方式是用一個相等長度 列表的字典或NumPy 數組。DataFrame 也可以通過columns 指定序列的順序進行 排序。 >>> data = {'OrderDate': ['1-6-10', '1-23-10', '2-9-10', '2-26-10', '3-15-10'], ... 'Region': ['East', 'Central', 'Central', 'West', 'E ast'], ... 'Rep': ['Jones', 'Kivell', 'Jardine', 'Gill', 'Sorv ino']} >>> >>> DataFrame(data,columns=['OrderDate','Region','Rep'])# 通過字典構建,按照cloumns 指定的順序排序 OrderDate Region Rep 0 1-6-10 East Jones 1 1-23-10 Central Kivell 2 2-9-10 Central Jardine 3 2-26-10 West Gill 4 3-15-10 East Sorvino #Pandas 中處理CSV 文件的函數主要為read_csv() 和to_csv() 這兩個,其中read_csv() 讀取CSV 文件的內容並返回DataFrame,to_csv() 則是其逆過程。 1)指定讀取部分列和文件的行數。具體的實現代碼如下: df = pd.read_csv("SampleData.csv",nrows=5,usecols=['OrderDate','Item','Total']) 方法read_csv() 的參數nrows 指定讀取文件的行數,usecols 指定所要讀取的列的列名, 如果沒有列名,可直接使用索引0、1、...、n-1。上述兩個參數對大文件處理非常有用,可 以避免讀入整個文件而只選取所需要部分進行讀取 2)設置CSV 文件與excel 兼容。dialect 參數可以是string 也可以是csv.Dialect 的實例。 如果將圖4-2 所示的文件格式改為使用“ |”分隔符,則需要設置dialect 相關的參數。error_ bad_lines 設置為False,當記錄不符合要求的時候,如記錄所包含的列數與文件列設置不相 等時可以直接忽略這些列。下面的代碼用於設置CSV 文件與excel 兼容,其中分隔符為“| ”, 而error_bad_lines=False 會直接忽略不符合要求的記錄。 >>> dia = csv.excel() >>> dia.delimiter="|" #設置分隔符 >>> pd.read_csv("SD.csv") OrderDate|Region|Rep|Item|Units|Unit Cost|Total 0 1-6-10|East|Jones|Pencil|95|1.99 |189.05 1 1-23-10|Central|Kivell|Binder|50|19.99 |999.50... >>> pd.read_csv("SD.csv",dialect = dia,error_bad_lines=False) Skipping line 3: expected 7 fields, saw 10 # 所有不符合格式要求的列將直接忽略 OrderDate Region Rep Item Units Unit Cost Total 0 1-6-10 East Jones Pencil 95 1.99 189.05 3)對文件進行分塊處理並返回一個可迭代的對象。分塊處理可以避免將所有的文件載入 內存,僅在使用的時候讀入所需內容。參數chunksize 設置分塊的文件行數,10 表示每一塊 包含10 個記錄。將參數iterator 設置為True 時,返回值為TextFileReader,它是一個可迭代對 象。來看下面的例子,當chunksize=10、iterator=True 時,每次輸出為包含10 個記錄的塊。 >>> reader = pd.read_table("SampleData.csv",chunksize=10,iterator=True) >>> reader <pandas.io.parsers.TextFileReader object at 0x0314BE70> >>> iter(reader).next() # 將TextFileReader 轉換為迭代器並調用next 方法 OrderDate,Region,Rep,Item,Units,Unit Cost,Total # 每次讀入10 行 0 1-6-10,East,Jones,Pencil,95, 1.99 , 189.05 1 1-23-10,Central,Kivell,Binder,50, 19.99 , 999.50 2 2-9-10,Central,Jardine,Pencil,36, 4.99 , 179.64 3 2-26-10,Central,Gill,Pen,27, 19.99 , 539.73 4 3-15-10,West,Sorvino,Pencil,56, 2.99 , 167.44 5 4-1-10,East,Jones,Binder,60, 4.99 , 299.40 6 4-18-10,Central,Andrews,Pencil,75, 1.99 , 149.25 7 5-5-10,Central,Jardine,Pencil,90, 4.99 , 449.10 8 5-22-10,West,Thompson,Pencil,32, 1.99 , 63.68 4)當文件格式相似的時候,支持多個文件合並處理。以下例子用於將3 個格式相同的 文件進行合並處理。 >>> filelst = os.listdir("test") >>> print filelst # 同時存在3 個格式相同的文件 ['s1.csv', 's2.csv', 's3.csv'] >>> os.chdir("test") >>> dfs =[pd.read_csv(f) for f in filelst] >>> total_df = pd.concat(dfs) # 將文件合並 >>> total_df OrderDate Region Rep Item Units Unit Cost Total 0 1-6-10 East Jones Pencil 95 1.99 189.05 1 1-23-10 Central Kivell Binder 50 19.99 999.5 '''