1. 程式人生 > 其它 >csv 轉excel 000字串_python 標準庫學習之 csv

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]])

namedialect 關聯起來。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 類是主要依賴於其屬性的容器類,用於將定義好的引數傳遞給特定的 readerwriter 例項。

  • 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

碼農升級

c2c51d152702c488c0d2aa5559039225.png

長按二維碼關注

46b31ee80177e0277e7ce1c00d9f5f64.png 你 點 的 每 個 在 看 , 我 都 認 真 當 成 了 喜 歡