溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中csv.DictReader()方法怎么使用

發(fā)布時(shí)間:2022-06-28 13:53:58 來源:億速云 閱讀:860 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“python中csv.DictReader()方法怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

簡(jiǎn)單使用csv.DictReader()方法

示例代碼1:

import csv
f = open('sample','r',encoding='utf8')
reader = csv.DictReader(f)
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader為了方便理解我們可以把它看成是一個(gè)列表嵌套OrderedDict(一種長(zhǎng)相類似于列表的數(shù)據(jù)類型)
    print(line) # OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')])

sample為一個(gè)txt文件,文件內(nèi)容如下:

id,name,age
1,jason,18
2,jian,20
3,xiaoming,30
4,dog,40

代碼運(yùn)行在終端輸出的結(jié)果為:

<csv.DictReader object at 0x000001FCF6FA0FD0>    # 來自于示例代碼1中的print(reader)
OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')])    # 來自于示例代碼1中的print(line)
1 jason 18    # 來自于示例代碼1中的print(line['id'],line['name'],line['age'])
OrderedDict([('id', '2'), ('name', 'jian'), ('age', '20')])
2 jian 20
OrderedDict([('id', '3'), ('name', 'xiaoming'), ('age', '30')])
3 xiaoming 30
OrderedDict([('id', '4'), ('name', 'dog'), ('age', '40')])
4 dog 40

OrderedDict是一種長(zhǎng)相類似于列表的數(shù)據(jù)類型,該列表中嵌套著元組例:line = OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')]),每個(gè)元組中的第一個(gè)元素為鍵,第二個(gè)元素為值(類似于字典),每個(gè)元組中的鍵是哪里來的呢?==默認(rèn)情況下(可以自己設(shè)置的)==csv.DictReader()讀到的第一行數(shù)據(jù)就是鍵。并且可以通過索引的方法來取出OrderedDict數(shù)據(jù)中的值print(line['id'],line['name'],line['age']) # 可以通過鍵進(jìn)行索引取值(類似于字典)。

使用csv.DictReader()之fieldnames參數(shù)

在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'])中添加參數(shù)fieldnames=['new_id','new_name','new_age']用來指定鍵。

示例代碼2:

import csv
f = open('sample','r',encoding='utf8')
# 通過fieldnames參數(shù)指定字段
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'])
head_row = next(reader) # next()方法用于移動(dòng)指針
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader為了方便理解我們可以把它看成是一個(gè)列表嵌套OrderedDict(一種長(zhǎng)相類似于列表的數(shù)據(jù)類型)
    print(line) # OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')]) 
    # 通過指定的字段進(jìn)行索引取值并打印輸出
    print(line['new_id'],line['new_name'],line['new_age']) # 可以通過鍵進(jìn)行索引取值(類似于字典)

next()方法用于移動(dòng)指針,示例代碼2中的head_row = next(reader)獲取的是第一行數(shù)據(jù)存儲(chǔ)在head_row中,執(zhí)行一次next()指針移動(dòng)一行,此時(shí)指針已經(jīng)移動(dòng)到了第二行開頭,再次讀數(shù)據(jù)的時(shí)候,就從第二行開始讀取。如果不執(zhí)行head_row = next(reader)則輸出中還會(huì)多出這樣的結(jié)果OrderedDict([('new_id', 'id'), ('new_name', 'name'), ('new_age', 'age')])第一行數(shù)據(jù)也被算在了其中。

代碼運(yùn)行在終端輸出的結(jié)果為:

<csv.DictReader object at 0x000001D329CF2080>    # 來自于示例代碼2的print(reader) 
OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18')])    # 來自于示例代碼2的print(line)
1 jason 18    # 來自于示例代碼2的print(line['new_id'],line['new_name'],line['new_age'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')])
2 jian 20
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30')])
3 xiaoming 30
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40')])
4 dog 40

使用csv.DictReader()之restkey參數(shù)

如果讀取的行具有比鍵名序列更多的值,此時(shí)則會(huì)將剩余的數(shù)據(jù)作為值添加到restkey中的鍵下面。此時(shí)我們修改sample文件多添加一列數(shù)據(jù)。
在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'],restkey='hobby')中添加restkey='hobby'用來指定接收多余值的鍵,并且要注意restkey只能傳入一個(gè)值,不能傳入列表,元組數(shù)據(jù)類型。

sample為一個(gè)txt文件,文件內(nèi)容如下:

id,name,age
1,jason,18,dbj
2,jian,20,lol
3,xiaoming,30,game
4,dog,40,noting

示例代碼3:

import csv
f = open('sample','r',encoding='utf8')
# 通過fieldnames參數(shù)指定字段,超出fieldnames中鍵數(shù)量的值,用restkey中的鍵來接收
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'],restkey='hobby')
head_row = next(reader) # next用于移動(dòng)指針
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader為了方便理解我們可以把它看成是一個(gè)列表嵌套OrderedDict(一種長(zhǎng)相類似于列表的數(shù)據(jù)類型)
    print(line) # OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')]) 
    # 通過指定的字段進(jìn)行索引取值并打印輸出
    print(line['new_id'],line['new_name'],line['new_age'],line['hobby']) # 可以通過鍵進(jìn)行索引取值(類似于字典)

代碼運(yùn)行在終端輸出的結(jié)果為:

<csv.DictReader object at 0x000001CB6B6030F0>    # 來自于示例代碼3的print(reader) 
OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', ['dbj'])]) # 來自于示例代碼3的print(line)
1 jason 18    # 來自于示例代碼3的print(line['new_id'],line['new_name'],line['new_age'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20'), ('hobby', ['lol'])])
2 jian 20
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30'), ('hobby', ['game'])])
3 xiaoming 30
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40'), ('hobby', ['noting'])])
4 dog 40

從代碼運(yùn)行結(jié)果中我們會(huì)發(fā)現(xiàn)多出來的值,確實(shí)使用restkey指定的鍵restkey='hobby'來接收了OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', ['dbj'])])
注意雖然多余的鍵可以用restkey指定的鍵接收,但是卻無法通過索引打印出來,也就是執(zhí)行print(line["hobby"])的話就會(huì)報(bào)錯(cuò)KeyError: 'hobby'。

使用csv.DictReader()之restval參數(shù)

如果讀取的行具有比鍵名序列更少的值,此時(shí)剩余的鍵則會(huì)使用可選參數(shù)restval中的值。此時(shí)我們修改sample文件多添加一列數(shù)據(jù)。
在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age','hobby'],restval='others')中添加restval='others'用來指定鍵對(duì)應(yīng)值為空時(shí)的默認(rèn)值,并且要注意restval也只能傳入一個(gè)值,不能傳入列表,元組數(shù)據(jù)類型。

sample為一個(gè)txt文件,文件內(nèi)容如下:

id,name,age
1,jason,18
2,jian,20,lol
3,xiaoming,30
4,dog,40,noting

示例代碼4:

import csv
f = open('sample','r',encoding='utf8')
# 通過fieldnames參數(shù)指定字段,超出fieldnames中鍵數(shù)量的值,用restkey中的鍵來接收
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age','hobby'],restval='others')
head_row = next(reader) # next用于移動(dòng)指針
# print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader為了方便理解我們可以把它看成是一個(gè)列表嵌套OrderedDict(一種長(zhǎng)相類似于列表的數(shù)據(jù)類型)
    print(line) # OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', 'others')]) 
    # 通過指定的字段進(jìn)行索引取值并打印輸出
    print(line['new_id'],line['new_name'],line['new_age'],line['hobby']) # 可以通過鍵進(jìn)行索引取值(類似于字典)

代碼運(yùn)行在終端輸出的結(jié)果為:

OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', 'others')])  # 來自于示例代碼4的print(line)
1 jason 18 others  # 來自于示例代碼4的print(line['new_id'],line['new_name'],line['new_age'],line['hobby'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20'), ('hobby', 'lol')])
2 jian 20 lol
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30'), ('hobby', 'others')])3 xiaoming 30 others
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40'), ('hobby', 'noting')])
4 dog 40 noting

“python中csv.DictReader()方法怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI