簡體   English   中英

Python:文件內容到字典

[英]Python: file contents to dictionary

編寫一個函數,接受CSV文件的文件名(字符串),其中包含有關學生姓名及其四門課程成績的信息,並返回信息字典。 字典的鍵應該是學生的名字,值應該是他們成績的浮點數列表。 例如,如果文件的內容如下所示:

Mark,90,93,60,90
Abigail,84,50,72,75
Frank,46,83,53,79
Yohaan,47,77,74,96

那么你的函數應該返回一個字典,如:

out_dict = {'Frank': [46.0, 83.0, 53.0, 79.0],
            'Mark': [90.0, 93.0, 60.0, 90.0],
            'Yohaan': [47.0, 77.0, 74.0, 96.0],
            'Abigail': [84.0, 50.0, 72.0, 75.0]}

這是我的代碼:

def dict_from_file (file_name):
    file_pointer = open(file_name, 'r')
    data = file_pointer.readlines()
    print (data)
    output_dict = {}
    for line in data:

    file_pointer.close()
    return (output_dict)

#Main Program
file_name = input("Enter the exact file name with its extension (.i.e., .txt): ")
result = dict_from_file (file_name)
print (result)

如您所見,for循環中缺少語句。 問題是我找不到任何邏輯來首先從文件中獲取輸入並將其粘貼到字典中。 如果我計划提取每一行,我將如何將其添加到字典中,其中名稱為鍵,四個數字為值?

要嚴格關注您的代碼:

如果你打印出你讀過的內容,你會發現你有這個:

['Mark,90,93,60,90\n', 'Abigail,84,50,72,75\n', 'Frank,46,83,53,79\n', 'Yohaan,47,77,74,96']

因此,當您遍歷列表中的每個項目時,為了簡化此示例,您幾乎可以提取第一個項目,現在將是您的密鑰,然后將列表中的一部分排除在名稱之外項目到浮動。

所以,你幾乎都在尋找:

l = line.split(',')
output_dict[l[0]] = map(float, l[1:])

正在發生的事情是,你正在把你正在迭代的每個項目,通過拆分','成為一個列表。 然后,您將獲取列表中的第一項,並將其作為您的密鑰。 然后要分配您的值,您必須使用map方法,該方法會將list中的每個項目映射到浮點數。

您將對要讀取的每一line執行該操作。

所以,最后,你會:

def dict_from_file (file_name):
    file_pointer = open(file_name, 'r')
    data = file_pointer.readlines()
    print (data)
    output_dict = {}
    for line in data:
        l = line.split(',')
        output_dict[l[0]] = map(float, l[1:])
    file_pointer.close()
    return output_dict

#Main Program
result = dict_from_file ('stuff.txt')
print (result)

運行該代碼,將為您提供:

{'Frank': [46.0, 83.0, 53.0, 79.0], 'Yohaan': [47.0, 77.0, 74.0, 96.0], 'Abigail': [84.0, 50.0, 72.0, 75.0], 'Mark': [90.0, 93.0, 60.0, 90.0]}

我建議你使用csv閱讀器:

import csv
with open(file_name, 'rb') as csvfile:
    csv_reader = csv.reader(csvfile)
    for row in csv_reader:
        output_dict[row[0]] = [float(n) for n in row[1:]]

如果正確插入你的for循環,這樣的東西應該工作。 我沒有測試過代碼,但它不應該太遠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM