csv 轉excel 000字串_python 標準庫學習之 csv
技術標籤:csv 轉excel 000字串
本文由作者 憑海臨風 授權刊登。原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/
文件路徑
官方文件:https://docs.python.org/zh-cn/3.8/library/csv.html
CSV 檔案格式
副檔名為.csv,通用的電子表格檔案格式,經常使用在資料分析中。
分隔符可能有所差別。python 中的 csv 模組提供了對 csv 檔案的讀寫操作,非常方便。
csv 常用方法
reader
csv.reader(csvfile,dialect='excel',***fmtparams)
返回一個
reader
物件,該物件遍歷 csvfile。csv 物件可以是任何物件,只要這個物件支援 iteratable 協議,並在每次呼叫__next__()
方法時都返回字串即可。如果 csvfile 是檔案物件,則開啟它時應使用newline=''
。可選引數dialect
是用於不同的 csv 檔案型別,它可以是Dialect
類的子類的例項,也可以是list_dialects()
函式返回的字串之一。完整的解釋可以參考 csv檔案格式引數。csv 檔案的每一行都會預設當做字串列表解析,除非指定了
QUOTE_NONNUMERIC
格式選項(在這種情況下,未加引號的欄位會轉換為浮點數),否則不會執行自動資料型別轉換。
一個讀檔案例子
>>>importcsv
>>>withopen('eggs.csv',newline='')ascsvfile:
...spamreader=csv.reader(csvfile,delimiter='',quotechar='|')
...forrowinspamreader:
...print(','.join(row))
Spam,Spam,Spam,Spam,Spam,BakedBeans
Spam,LovelySpam,WonderfulSpam
writer
csv.writer(csvfile,dialect='excel',**fmtparams)
返回一個 writer 物件,該物件負責將使用者的資料在給定的檔案類物件上轉換為帶分隔符的字串。csvfile 可以是具有
write()
方法的任何物件。如果 csvfile 是檔案物件,則開啟它時應使用newline=''
。為了儘量簡化與資料庫 API 模組之間的對接,
None
值會寫入為空字串。雖然這個轉換是不可逆的,但它讓 SQL 空資料值轉儲到 CSV 檔案更容易,而無需預處理從cursor.fetch*
呼叫返回的資料。寫入前,所有非字串資料都先用str()
轉化為字串再寫入。
一個寫檔案例子
importcsv
withopen('eggs.csv','w',newline='')ascsvfile:
spamwriter=csv.writer(csvfile,delimiter='',quotechar='|',quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam']*5+['BakedBeans'])
spamwriter.writerow(['Spam','LovelySpam','WonderfulSpam'])
register_dialect
csv.register_dialect(name[,dialect[,**fmtparams]])
將 name 與 dialect 關聯起來。name 必須是字串。要指定變種 (dialect),可以給出
Dialect
的子類,或給出 fmtparams 關鍵字引數,或兩者都給出(此時關鍵字引數會覆蓋 dialect 引數)。有關方言和格式設定引數的完整詳細資訊,請參見 方言格式引數 部分。
其他方法:
csv.unregister_dialect(name)
從變種登錄檔中刪除 name 對應的變種。如果 name 不是已註冊的變種名稱,則丟擲Error
異常。csv.get_dialect(name)
返回 name 對應的變種。如果 name 不是已註冊的變種名稱,則丟擲Error
異常。該函式返回的是不可變的Dialect
物件。csv.list_dialects()
返回所有已註冊變種的名稱。csv.field_size_limit([new_limit])
返回解析器當前允許的最大欄位大小。如果指定了 new_limit,則它將成為新的最大欄位大小。
csv 模組定義的類
DictReader
classcsv.DictReader(*f*,*fieldnames=None*,*restkey=None*,*restval=None*,*dialect='excel'*,**args*,***kwds*)
建立一個物件,該物件在操作上類似於常規 reader,但是將每行中的資訊對映到一個
dict
,該 dict 的鍵由 fieldnames 可選引數給出。fieldnames 引數是一個 sequence。如果省略 fieldnames,則檔案 f 第一行中的值將用作欄位名。無論欄位名是如何確定的,字典都將保留其原始順序。
如果某一行中的欄位多於欄位名,則其餘欄位將放入列表中,欄位名由 restkey 指定(預設為
None
)。如果非空白行的欄位少於欄位名,則缺少的值將用None
填充。所有其他可選或關鍵字引數都傳遞給底層的
reader
例項。3.8 中,返回的行是
dict
型別。
一個使用DictReader
例子
>>>importcsv
>>>withopen('names.csv',newline='')ascsvfile:
...reader=csv.DictReader(csvfile)
...forrowinreader:
...print(row['first_name'],row['last_name'])
...
EricIdle
JohnCleese
>>>print(row)
{'first_name':'John','last_name':'Cleese'}
DictWriter
classcsv.DictWriter(f,fieldnames,restval='',extrasaction='raise',dialect='excel',**args,**kwds)
建立一個物件,該物件在操作上類似常規 writer,但會將字典對映到輸出行。fieldnames 引數是由鍵組成的
序列
,它指定字典中值的順序,這些值會按指定順序傳遞給writerow()
方法並寫入檔案 f。如果字典缺少 fieldnames 中的鍵,則可選引數 restval 用於指定要寫入的值。如果傳遞給writerow()
方法的字典的某些鍵在 fieldnames 中找不到,則可選引數 extrasaction 用於指定要執行的操作。如果將其設定為預設值'raise'
,則會引發ValueError
。如果將其設定為'ignore'
,則字典中的其他鍵值將被忽略。所有其他可選或關鍵字引數都傳遞給底層的writer
例項。注意,與
DictReader
類不同,DictWriter
類的 fieldnames 引數不是可選引數
一個使用DictWriter
寫入檔案例子
importcsv
withopen('names.csv','w',newline='')ascsvfile:
fieldnames=['first_name','last_name']
writer=csv.DictWriter(csvfile,fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name':'Baked','last_name':'Beans'})
writer.writerow({'first_name':'Lovely','last_name':'Spam'})
writer.writerow({'first_name':'Wonderful','last_name':'Spam'})
其他方法:
class
csv.Dialect
Dialect
類是主要依賴於其屬性的容器類,用於將定義好的引數傳遞給特定的reader
或writer
例項。class
csv.excel
excel
類定義了 Excel 生成的 CSV 檔案的常規屬性。它在變種登錄檔中的名稱是'excel'
。class
csv.excel_tab
excel_tab
類定義了 Excel 生成的、製表符分隔的 CSV 檔案的常規屬性。它在變種登錄檔中的名稱是'excel-tab'
。class
csv.unix_dialect
unix_dialect
類定義了在 UNIX 系統上生成的 CSV 檔案的常規屬性,即使用'\n'
作為換行符,且所有欄位都有引號包圍。它在變種登錄檔中的名稱是'unix'
。
class csv.Sniffer
Sniffer
類用於推斷 CSV 檔案的格式。
Sniffer
類提供了兩個方法:
sniff
(sample, delimiters=None)分析給定的 sample 並返回一個
Dialect
子類,該子類中包含了分析出的格式引數。如果給出可選的 delimiters 引數,則該引數會被解釋為字串,該字串包含了可能的有效定界符。has_header
(sample)分析示例文字(假定為 CSV 格式),如果第一行很可能是一系列列標題,則返回
True
。
一個使用 Sniffer
的例子:
withopen('example.csv',newline='')ascsvfile:
dialect=csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader=csv.reader(csvfile,dialect)
#...processCSVfilecontentshere...
csv 中定義的常量
csv.QUOTE_ALL
指示
writer
物件給所有欄位加上引號。csv.QUOTE_MINIMAL
指示
writer
物件僅為包含特殊字元(例如 定界符、引號字元 或 行結束符 中的任何字元)的欄位加上引號。csv.QUOTE_NONNUMERIC
指示
writer
物件為所有非數字欄位加上引號。指示 reader 將所有未用引號引出的欄位轉換為 float 型別。csv.QUOTE_NONE
指示
writer
物件不使用引號引出欄位。當 定界符 出現在輸出資料中時,其前面應該有 轉義符。如果未設定 轉義符,則遇到任何需要轉義的字元時,writer 都會丟擲Error
異常。指示reader
不對引號字元進行特殊處理。
csv 模組定義了以下異常:
exception
csv.Error
該異常可能由任何發生錯誤的函式丟擲。
備註
如果沒有指定 newline=''
,則嵌入引號中的換行符將無法正確解析,並且在寫入時,使用 \r\n
換行的平臺會有多餘的 \r
寫入。由於 csv 模組會執行自己的(通用)換行符處理,因此指定 newline=''
應該總是安全的。
總結
csv 模組是一個非常實用的處理 csv 檔案的標準庫,提供了兩個核心類。一個是把 csv 檔案物件當作字串列表解析 csv 檔案的類,另一個是把 csv 檔案物件當作字典解析的類。
End
碼農升級
長按二維碼關注
你 點 的 每 個 在 看 , 我 都 認 真 當 成 了 喜 歡