1. 程式人生 > 實用技巧 >python解析.csv格式檔案--csv模組(內建)

python解析.csv格式檔案--csv模組(內建)

第一part:CSV檔案格式介紹


1)CSV的含義:

逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。CSV檔案由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由欄位組成,欄位間的分隔符是其它字元或字串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的欄位序列.

2)CSV的特點:
(1)讀取出的資料一般為字元型別,如果是數字需要手動轉換為數字;
(2)以行為單位讀取資料;
(3)列之間以半形逗號或製表符為分隔,一般為半形逗號;
(4)一般為每行開頭不空格,第一行是屬性列,資料列之間以間隔符為間隔無空格,行之間無空行。

3)CSV的檔案內容結構:


第二part:讀取csv格式資料--reader


操作.csv檔案可以直接使用python的內建模組:csv,讀資料的程式碼如下:

#導包
import csv
#csv格式檔案實際就是文字型別;讀取csv檔案資料
#如果檔案中存在中文的話,則必須設定其編碼格式,否則得到的結果可能是亂碼
with open("data1.csv", encoding="utf-8") as fp:
get_read_csv=csv.reader(fp,dialect="excel")
# 返回的是get_read_csv是一個迭代器:__iter__ __next__

print("表頭的值為:",next(get_read_csv))
#遍歷表內容,輸出每行的值,型別為list,可以根據需求輸出需要的型別
for value in get_read_csv:
print("表內容為",value)

執行結果,如下:

從上面程式碼可發現,讀取csv格式的資料,使用的是csv.reader()方法

csv.reader(csvfile, dialect='excel',delimiter='\t'**fmtparams):

該函式返回一個reader物件,該物件可以迭代csv檔案中的每一行,csv檔案可以是任意支援iteratior協議的物件。每次呼叫它的__next__()方法(檔案物件和列表物件都適用的方法),該物件返回一個字串。從csv檔案讀取的每一行,都以列表的形式返回。


引數解釋:
csvfile:可以是任何支援迭代器協議的物件,它每次返回一個字串。如果它是一個檔案物件,它應該以newline=''的形式開啟(參照樣例).
dialect:是一個可選引數,用來定義一個僅針對特定CSV dialect的引數集。它可能是一個Dialect類的子類例項或由list_dialects()返回的多個字串中的一個。

delimiter:是一個可選引數,delimiter='\t'表示去掉分隔符'\t'


第三part:寫資料到csv檔案中



import csv

#csv檔案中進行寫入資料
with open("data1.csv",mode="a") as fp:
#建立寫入物件
writer_csv=csv.writer(fp)
#writerow以一行的形式進行寫入,傳入的是一個可迭代物件
#傳入的值型別為元組
writer_csv.writerow(("a","b","c"))
# 傳入的值型別為列表
writer_csv.writerow([1,2,3,4,5,6])
#傳入的是值型別為字典
writer_csv.writerow({"name": "zhangans", "age": 10})
# 上述程式碼實際寫入到csv檔案中的是對應字典的鍵名,不會將值寫入(因為預設操作是字典的鍵名),如果需要傳入對應的鍵值的話則可以使用下面程式碼:
writer_csv.writerow([value for value in {"name": "zhangsan", "age": 10}.values()])
# 寫多行:可以通過writerows方法,傳入的引數是一個二維可迭代物件
writer_csv.writerows([[1,2,3],[4,5,6]])
執行結果,如下: