簡介
csv檔案具有格式簡單,快速訪問,相容性好等特點,工程、金融、商業等很多資料檔案都是採用csv檔案儲存和處理。工作中資料處理也用到了csv,簡要總結下使用經驗,特別是那些由於本地相容性導致的與官方文件的差異使用。
csv(comma seperated values)檔案的格式非常簡單,類似乙個文字文件,每一行儲存一條資料,同一行中的各個資料通常採用逗號(或tab)分隔。
與python相關
python自帶了csv模組,專門用於處理csv檔案的讀取和存檔。
csv模組中,主要由兩種方式訪問csv檔案:函式方法;類方法。
常用函式
讀操作csv.reader(csvfile,dialect ="excel",** fmtparams)
返回乙個reader物件,它將迭代給定csvfile中的行。
csvfile可以是任何支援迭代器協議的物件,並在每次next()呼叫其方法時返回乙個字串- 檔案物件和列表物件都是合適的。如果csvfile是乙個檔案物件,那麼它必須在平台上以「b」標誌開啟,這會產生影響。可以給出可選的 dialect 引數,該引數用於定義特定於csv方言的一組引數。它可以是類的子類的例項,也可以是函式dialect返回的字串之一 list_dialects()。其他可選的fmtparams可以給出關鍵字引數來覆蓋當前方言中的各個格式引數。
import csv
with open("erroe.csv","rb") as csvred:
spam = csv.reader(csvred,delimiter=" ", quotechar="|")
for rem in spam:
print ",".join(rem)
寫操作csv.writer(csvfile,dialect ="excel",** fmtparams)
返回乙個編寫器物件,負責將使用者的資料轉換為給定的類檔案物件上的分隔字串。
csvfile可以是帶有write()方法的任何物件 。如果csvfile是乙個檔案物件,那麼它必須在平台上以「b」標誌開啟,這會產生影響。 可以給出可選的dialect引數,該引數用於定義特定於csv方言的一組引數。它可以是類的子類的例項,也可以是函式dialect返回的字串之一 list_dialects()。可以給出其他可選的fmtparams關鍵字引數來覆蓋當前dialect中的各個格式引數。
import csv
with open("error.csv", "wb") as csvfile:
spamwriter = csv.writer(csvfile, delimiter=" ", quotechar="|", quoting=csv.quote_minimal)
spamwriter.writerow(["spam"] * 5 + ["baked beans"])
spamwriter.writerow(["spam", "lovely spam", "wonderful spam"])
其他csv.register_dialect(name,[dialect,] ** fmtparams)
將dialect與name聯絡起來。 name必須是字串或unicode物件。dialect可以通過傳遞子類dialect,或通過fmtparams關鍵字引數或兩者來指定,並使用關鍵字引數覆蓋dialect的引數
csv.unregister_dialect(name)
從dialect登錄檔中刪除與名稱關聯的dialect。如果name不是已註冊的dialect名稱,則引發an 錯誤
csv.get_dialect(name)
返回與name相關的dialect。如果name 不是已註冊的dialect名稱,則引發an 錯誤
csv.list_dialects()
返回所有已註冊dialect的名稱
csv.field_size_limit([new_limit])
返回解析器允許的當前最大字段大小。如果給出new_limit,則這將成為新限制
常用類讀操作
class csv.dictreader(f,fieldnames = none,restkey = none,restval = none,dialect ="excel",* args,** kwds)
建立乙個像常規閱讀器一樣操作的物件,但將讀取的資訊對映到乙個dict,其鍵由可選的 fieldnames引數給出。欄位名的引數是乙個序列,其元素與輸入資料的順序中的字段相關聯。這些元素成為結果字典的關鍵。如果省略fieldnames引數,則檔案f的第一行中的值將用作欄位名。如果讀取的行包含的字段多於欄位名序列,則將剩餘資料新增為由restkey值鍵入的序列。如果讀取的行的字段數少於欄位名序列,則其餘的鍵將採用可選的restval引數的值。任何其他可選或關鍵字引數都將傳遞給基礎reader例項。
import csv
with open("/users/mioji/desktop/api_error/error.csv") as csvfile:
reader = csv.dictreader(csvfile)
for row in reader:
print(row["apan"], row["spam"])
寫操作class csv.dictwriter(f,fieldnames,restval ="",extrasaction ="raise",dialect ="excel",* args,** kwds)
建立乙個像常規編寫器一樣操作的物件,但將字典對映到輸出行。的欄位名的引數是乙個序列識別在哪些值在傳遞給字典中的順序按鍵的writerow()方法被寫入到檔案˚f。如果字典缺少欄位名中的鍵,則可選的restval引數指定要寫入的值。如果傳遞給方法的字典包含在欄位名中找不到的鍵,則可選的extrasaction引數指示要採取的操作。如果設定為a 則被提公升。如果設定為writerow()"raise"valueerror"ignore",字典中的額外值將被忽略。任何其他可選或關鍵字引數都將傳遞給基礎 writer例項。
請注意,與dictreader類不同,它的fieldnames引數dictwriter不是可選的。由於python的dict 物件沒有排序,因此沒有足夠的資訊來推斷應該將行寫入檔案f的順序。
import csv
with open("names.csv", "w") as csvfile:
fieldnames = ["first_name", "last_name"]
writer = csv.dictwriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow()
writer.writerow()
writer.writerow()
其他class csv.dialect
dialect類是依賴於主要用於它的屬性,這是用來定義乙個特定的引數的容器類 reader或writer例項
class csv.excel
在excel類定義的excel生成csv檔案的通常的性質。它以方言名稱註冊"excel"。
class csv.excel_tab
excel_tab類定義excel生成的製表符分隔的檔案的通常的性質。它以方言名稱註冊"excel-tab"。
class csv.sniffer
sniffer類用來推斷乙個csv檔案的格式。
sniffer類提供了兩個方法:
sniff(樣本,分隔符=無):分析給定的樣本並返回dialect反映找到的引數的子類。如果給出了可選的delimiters引數,則將其解釋為包含可能的有效分隔符的字串。
has_header(樣本):分析示例文字(假定為csv格式), true如果第一行看起來是一系列列標題,則返回。
常量csv.quote_all
指示writer物件引用所有字段。
csv.quote_minimal
指示writer物件只引用那些包含特殊字元,如欄位分隔符,quotechar或任何字元 lineterminator。
csv.quote_nonnumeric
指示writer物件引用所有非數字字段。
指示讀者將所有非引用字段轉換為float型別。
csv.quote_none
指示writer物件永遠不引用字段。當輸出資料**現當前 分隔符時,它前面是當前的escapechar 字元。如果未設定escapechar,則error在遇到需要轉義的任何字元時,編寫器將引發。
指示reader不對引號字元執行特殊處理。
Python csv模組學習
csv cmma separated values 是逗號分隔值 也稱字元分隔值,因為分隔符可以不是逗號 的簡寫。是一種常用的文字格式,用以儲存 資料,包括數字或者字元。純文字意味著該檔案是乙個字串行,不含必須像二進位制數字那樣被解讀的資料。csv檔案由任意數目的記錄組成,記錄間以某種換行符分隔 每...
python csv模組練習
建立,寫入,讀取 coding utf 8 import csv 作用 csv模組練習 def create with open b data.csv wb as file 不存在會建立 w csv.writer file,delimiter 指定分割字元,預設 w.writerow 姓名 性別 年...
Python CSV模組簡介
2.參考資料 csv檔案格式是一種通用的電子 和資料庫匯入匯出格式。最近我呼叫rpc處理伺服器資料時,經常需要將資料做個存檔便使用了這一方便的格式。python csv模組封裝了常用的功能,使用的簡單例子如下 讀取csv檔案 import csv with open some.csv rb as f...