Python必學模塊之CSV模塊


一、CSV簡介

​ CSV(Comma Separated Values)是逗號分隔符文本格式,常用於Excel和數據庫的導入和導出,Python內置的CSV模塊提供對CSV格式文件讀取和寫入的對象。

二、python讀取CSV文件

2.1 csv.reader() 方法

csv.reader(csvfile, dialect=‘excel’, **fmtparams)

主要用於文件的讀取,返回一個reader迭代對象, 用於在csv文件內容上進行行迭代。

參數解讀:

參數 解釋
csvfile 需要一個文件對象或者list對象
dialect 用於指定csv的格式模式不同程序輸出的csv格式有細微差別
fmtparams 是一系列參數列表,主要用於設置特定的格式,以覆蓋dialect中的格式

可用屬性:

csv.reader對象是可迭代對象,包含以下屬性:

  1. csv.reader().dialect #返回其dialect
  2. csv.reader().line_num #f返回讀入的行數
  3. csvreader.fieldnames #返回標題字段名

代碼實例:


'''
程序操作的 stock.csv 文件

'''
index,secID,ticker,secShortName,exchangeCD,tradeDate,preClosePrice,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol
0,000001.XSHE,1,平安銀行,XSHE,2017-12-1,13.38,13.4,13.48,12.96,13,178493315
1,000002.XSHE,2,萬科A,XSHE,2017-12-1,31.22,30.5,32.03,30.5,30.73,55743855
2,000004.XSHE,4,國農科技,XSHE,2017-12-1,25.56,25.41,26.4,25.18,26.2,2211059
3,000005.XSHE,5,世紀星源,XSHE,2017-12-1,4.2,4.2,4.24,4.2,4.22,2365348
4,000006.XSHE,6,深振業A,XSHE,2017-12-1,9.85,0,0,0,9.85,0
5,000007.XSHE,7,全新好,XSHE,2017-12-1,16.66,0,0,0,16.66,0
6,000008.XSHE,8,神州高鐵,XSHE,2017-12-1,8.48,8.48,8.74,8.41,8.59,5689054
7,000009.XSHE,9,中國寶安,XSHE,2017-12-1,7.6,7.61,7.63,7.53,7.58,9149395
8,000010.XSHE,10,美麗生態,XSHE,2017-12-1,5.13,5.13,5.23,5.11,5.21,6765580
9,000011.XSHE,11,深物業A,XSHE,2017-12-1,17.18,17.08,17.28,17,17.11,2474700
10,000012.XSHE,12,南玻A,XSHE,2017-12-1,9.19,9.1,9.28,9.02,9.11,35308183
11,000014.XSHE,14,沙河股份,XSHE,2017-12-1,12.6,12.49,12.73,12.45,12.64,1236110
12,000016.XSHE,16,深康佳A,XSHE,2017-12-1,6.2,6.34,6.54,6.31,6.43,29434715
13,000017.XSHE,17,深中華A,XSHE,2017-12-1,6.68,6.63,6.68,6.6,6.68,1562976
14,000018.XSHE,18,神州長城,XSHE,2017-12-1,7.16,7.16,7.21,7.1,7.15,5792996
15,000019.XSHE,19,深深寶A,XSHE,2017-12-1,12.15,0,0,0,12.15,0
16,000020.XSHE,20,深華髮A,XSHE,2017-12-1,14.99,15.28,15.3,14.75,15,3250307
17,000021.XSHE,21,深科技,XSHE,2017-12-1,9.08,9.07,9.41,9.05,9.34,19877164
18,000022.XSHE,22,深赤灣A,XSHE,2017-12-1,24.14,0,0,0,24.14,0
19,000023.XSHE,23,深天地A,XSHE,2017-12-1,22.57,22.41,22.82,22.41,22.62,318725
20,000025.XSHE,25,特力A,XSHE,2017-12-1,40.56,40.25,40.67,40.08,40.17,1584600

使用csv.reader對象從csv文件讀取數據,結果爲列表對象row,需要通過索引row[i]訪問。

import csv


# 讀取CSV文件的兩種方法

# ===========================================================
# csv.reader()方法

with open('stock.csv','r',encoding='gbk')as f:
    Reads = csv.reader(f)
    print(type(Reads))   # <class '_csv.reader'>
    for i in Reads:
        # print(i)
        print(i[3],Reads.line_num)  # 可以通過下標取值,獲取所有上市公司名稱,.並獲取所在文件的行數

結果:

<class '_csv.reader'>
secShortName 1
平安銀行 2
萬科A 3
國農科技 4
世紀星源 5
深振業A 6
全新好 7
神州高鐵 8
....

2.2 csv.DictReader()方法

如果希望通過csv文件的首行標題字段名訪問存儲數據,則可以使用csv.DictReader對象讀取

csv.DictReader(csvfile,fieldnames=None,restkey=None,restval=None,dialect=‘excel’,*args,**kwds)

也可叫next(reader), 返回的是一個reader字典對象

參數解讀:

參數 解釋
csvfile 需要一個文件對象或者list對象
dialect 用於指定csv的格式模式不同程序輸出的csv格式有細微差別
fmtparams 用於指定字段名,如果沒有指定,則第一行爲字段名
restkey和restval 用於指定字段名和數據個數不一致時所對應的字段名或數據值

DictReader對象屬性和方法:

方法:

csv.DictReader().next()# 稱之爲next(reader)

屬性:

  • csvreader.dialect # 解析器使用的方言的只讀描述。
  • csvreader.line_num #返回讀入的行數
  • csvreader.fieldnames #返回標題字段名

代碼實例

with open('stock.csv','r',encoding='gbk')as f:
    Reads = csv.DictReader(f)
    print(type(Reads))   # <class '_csv.reader'>
    for i in Reads:
        print(i['secShortName'], Reads.line_num)  # 通過字典的key獲取上市公司名稱.並獲取所在文件的行數

結果:

<class 'csv.DictReader'>
平安銀行 2
萬科A 3
國農科技 4
世紀星源 5
深振業A 6
全新好 7
神州高鐵 8
....
略

三、 python寫入CSV文件

3.1 csv.writer()對象

csv.writer(csvfile,dialect=‘excel’,**fmtparams)

主要用於把列表數據寫入到csv文件。

參數解讀:

參數 解釋
csvfile 任何支持write()方法的對象,通常爲文件對象
dialect 用於指定csv的格式模式不同程序輸出的csv格式有細微差別
fmtparams 是一系列參數列表,主要用於設置特定的格式,以覆蓋dialect中的格式

可用方法:

  1. writer.writerow(row)   # 方法,寫入一行數據

  2. writer.writerows # 方法,寫入多行數據

可用屬性:

writer.dialect # 只讀屬性,返回其 dialect

代碼實例

import csv

headers = ('name','sex','age')
students = [
    ("金鞍少年",'male',18),
    ("白馬金鞍",'male',17),
]

with open("students.csv",'w',encoding='gbk',newline='') as fp:
    writer = csv.writer(fp, dialect='excel')
    writer.writerow(headers)   # 寫入一行
    writer.writerows(students)  # 寫入多行
    print(writer.dialect)   # <_csv.Dialect object at 0x000001F166725DB0>


結果:
在這裏插入圖片描述

3.2 csv.DictWriter()對象

csv.DictWriter(csvfile,fieldnames,restval = ‘’,extrasaction = ‘raise’,dialect = ‘excel’,*args,**kwds)

參數解讀:

extrasaction用於指定多餘字段時的操作,其他參數同上

DictWriter對象方法:

  1. csvwriter.writerow(row) # 將row寫入writer的文件對象,根據當前方言進行格式化。支持迭代
  2. csvwriter.writerows(rows) # 將行中的所有元素寫入編寫器的文件對象,並根據當前方言進行格式化。支持迭代
  3. DictWriter.writeheader() # 寫入標題字段名

DictWriter對象屬性:

csvwriter.dialect # 使用的方言只讀描述

代碼實例:

headers = ('name','sex','age')
students = [
    {"name":"金鞍少年","sex":"male","age":18},
    {"name":"白馬金鞍","sex":"male","age":18},

]
# newline='' 寫入內容不換行
with open("students2.csv",'w',encoding='gbk',newline='') as fp:
    writer = csv.DictWriter(fp,headers,dialect='excel')
    # 雖然DictWriter創建的時候有一個headers,但是想要寫入數據進去,還是需要調用
    # writer.writeheader()方法,否則,表頭數據寫入不進去
    writer.writeheader()    # 寫入標題字段名
    writer.writerows(students)

結果:
在這裏插入圖片描述

四、csv文件格式化參數和Dialect對象

4.1 csv 文件格式化參數

創建reader/writer對象時,可以指定csv文件格式化命名參數。

常用參數:

參數 作用
delimiter 用於分隔字段的分隔符。默認爲","
lineterminator 用於寫操作的行結束符,默認爲“’\r\n ’ 。讀操作將忽略此選項,它能認出跨平臺的行結束符
quotechar 用於帶有特殊字符(如分隔符)的字段的引用符號。默認爲’ " ’
quoting 引用約定可選值有csv.QUOTE _ ALL(引用所有字段),csv.QUOTE_MINIMAL((引用如分隔符之類特殊字符的字段)默認),csv.QUOTE_NONNUMERIC((非數字字段)),csv.QUOTE_NON((不引用))
skipinitialspace 忽略分隔符後面的空白符。默認爲False
doublequote 如何處理字段內的引用符號。如果爲True ,字符串中的雙引號使用" "表示;如果爲False,使用轉義字符escapechar指定的字符
escapechar 用於對分隔符進行轉義的字符串
strict 如果爲True,讀入錯誤格式的CSV行時將導致csv.Error;默認值爲False

代碼示例:

import csv

def writecsv3(csvfilepath):
    headers = ['學號', '姓名', '性別', '班級', '語文', '數學', '英語']
    rows = [
        {'學號': '100010', '姓名': '小南', '性別': '男', '班級': '1班', '語文': '70', '數學': '89', '英語': '85'},
        {'學號': '100011', '姓名': '小風', '性別': '女', '班級': '6班', '語文': '79', '數學': '89', '英語': '85'}
            ]
    with open(csvfilepath, 'w', newline='') as f:
        f_csv = csv.DictWriter(f, headers, delimiter=',', quoting=csv.QUOTE_MINIMAL)
        f_csv.writeheader()
        f_csv.writerows(rows)


if __name__ == '__main__':
    writecsv3('students3.csv')

4.2 Dialect 對象

若干格式化參數可以組成Dialect對象,Dialect對象包含對應於命名格式化參數的屬性。可以創建 Dialect或其派生類的對象,然後傳遞給reader或writer的構造函數。

下列 csv模塊的函數可以創建Dialect對象

  1. csv.register_dialect(name[,dialect],**fmtparams):使用命名參數,註冊一個名稱
  2. csv.unregister_dialect(name):取消註冊的名稱。
  3. csv.get_dialect(name):獲取註冊的名稱的Dialect對象,無註冊時csv.Error
  4. csv.list_dialects():所有註冊Dialect對象的列表。

​ 另外可以使用csv模塊函數,獲取和設置字段的長度限制:csv.filed_size_limit([new_linit]

import csv

def writecsv4(csvfilepath):
    csv.register_dialect('mydialect', delimiter='*', quoting=csv.QUOTE_ALL)
    headers = ['學號', '姓名', '性別', '班級', '語文', '數學', '英語']
    rows = [{'學號': '100013', '姓名': '小北', '性別': '男', '班級': '1班', '語文': '70', '數學': '80', '英語': '85'},
            {'學號': '100014', '姓名': '小琴', '性別': '女', '班級': '6班', '語文': '77', '數學': '89', '英語': '85'}
            ]
    with open(csvfilepath, 'a+', newline='') as f:
        f_csv = csv.DictWriter(f, headers, dialect='mydialect')
        f_csv.writerows(rows)

if __name__ == '__main__':
    writecsv4('students4.csv')

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章