亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:將csv轉換為dict - 使用標頭作為鍵

Python:將csv轉換為dict - 使用標頭作為鍵

慕標琳琳 2022-08-11 17:11:48
Python: 3.x你好。我有下面的csv文件,它有標題和行。行計數可能因文件而異。我正在嘗試將此csv轉換為字典格式,并且第一行的數據正在重復。"cdrRecordType","globalCallID_callManagerId","globalCallID_callId"1,3,92948991,3,9294933Code:parserd_list = []output_dict = {}with open("files\\CUCMdummy.csv") as myfile:    firstline = True    for line in myfile:        if firstline:            mykeys = ''.join(line.split()).split(',')            firstline = False        else:            values = ''.join(line.split()).split(',')            for n in range(len(mykeys)):                output_dict[mykeys[n].rstrip('"').lstrip('"')] = values[n].rstrip('"').lstrip('"')                print(output_dict)                parserd_list.append(output_dict)#print(parserd_list)(通常我的csv列計數超過20,但我已經提供了一個示例文件。(我使用rstrip / lstrip來擺脫雙引號。Output getting:{'cdrRecordType': '1'}{'cdrRecordType': '1', 'globalCallID_callManagerId': '3'}{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294899'}{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294899'}{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294899'}{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294933'}這是內部循環的輸出。和最終輸出也是一樣的。printfor我不知道我犯了什么錯誤。有人請幫助糾正它。提前致謝。
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

使用 csv。DictReader

import csv
    with open("files\\CUCMdummy.csv", mode='r',newline='\n') as myFile:
        reader = list(csv.DictReader(myFile, delimiter=',',quotechar='"'))


查看完整回答
反對 回復 2022-08-11
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

不應手動解析 CSV 文件,而應使用 csv 模塊。


這將產生更簡單的腳本,并有助于優雅地處理邊緣情況(例如標題行,不一致的引號字段等)。


import csv


with open('example.csv') as csvfile:

    reader = csv.DictReader(csvfile)

    for row in reader:

        print(row)

輸出:


$ python3 parse-csv.py

OrderedDict([('cdrRecordType', '1'), ('globalCallID_callManagerId', '3'), ('globalCallID_callId', '9294899')])

OrderedDict([('cdrRecordType', '1'), ('globalCallID_callManagerId', '3'), ('globalCallID_callId', '9294933')])

如果您打算手動解析,可以使用以下方法:


parsed_list = []

with open('example.csv') as myfile:

    firstline = True

    for line in myfile:

        # Strip leading/trailing whitespace and split into a list of values.

        values = line.strip().split(',')


        # Remove surrounding double quotes from each value, if they exist.

        values = [v.strip('"') for v in values]


        # Use the first line as keys.

        if firstline:

            keys = values

            firstline = False

            # Skip to the next iteration of the for loop.

            continue


        parsed_list.append(dict(zip(keys, values)))


for p in parsed_list:

    print(p)

輸出:


$ python3 manual-parse-csv.py

{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294899'}

{'cdrRecordType': '1', 'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294933'}


查看完整回答
反對 回復 2022-08-11
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

代碼的縮進是錯誤的。


這兩行:


  print(output_dict)

  parserd_list.append(output_dict)

可以簡單地取消縮進,與它們上方的 for 循環位于同一行上。最重要的是,您需要為每個新文件行設置一個新字典。


您可以這樣做:就在密鑰的 for 循環之前。output_dict = {}


如上所述,有一些庫將使生活更輕松。但是,如果您想堅持追加字典,則可以加載文件的行,將其關閉,然后按如下方式處理行:


with open("scratch.txt") as myfile:

    data = myfile.readlines()


keys = data[0].replace('"','').strip().split(',')


output_dicts = []

for line in data[1:]:

    values = line.strip().split(',')

    output_dicts.append(dict(zip(keys, values)))


print output_dicts 



[{'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294899', 'cdrRecordType': '1'}, {'globalCallID_callManagerId': '3', 'globalCallID_callId': '9294933', 'cdrRecordType': '1'}]



查看完整回答
反對 回復 2022-08-11
  • 3 回答
  • 0 關注
  • 300 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號