【问题标题】:Read Text file and Create a Python Dictionary [closed]读取文本文件并创建 Python 字典 [关闭]
【发布时间】:2018-08-18 16:25:36
【问题描述】:

我有一个如下所述的文本文件:

KEY,NAME,RANK,BOOKNAME,SCORE,AUTHER
123,ABCD,500,FREEDOM1,15200,PXYZ
133,EFGH,400,FREEDOM2,15300.5,XTYZ
nan,SYGH,700,FREEDOM3,15400,RYYZ
143,LKMN,800,FREEDOM4,15500.5,XYCZ

我想阅读这个文本文件并创建一个嵌套字典,它将在我的后续程序中使用。

dict = {
123:{'NAME':'ABCD','RANK':500,'BOOKNAME':'FREEDOM1', 'SCORE':15200, 'AUTHER':'PXYZ'},
133:{'NAME':'EFGH','RANK':400,'BOOKNAME':'FREEDOM2', 'SCORE':15300.5, 'AUTHER':'XTYZ'},
143:{'NAME':'LKMN','RANK':800,'BOOKNAME':'FREEDOM4', 'SCORE':15500.5, 'AUTHER':'XYCZ'}
}

注意:代码应删除具有 'nan' KEY 值的行

【问题讨论】:

  • 如果你自己努力解决这个问题,通常 stackoverflow 效果最好,并与我们分享这个努力
  • 请添加您目前编写的代码
  • 先生,我对 Python 很陌生。我无法拆分列名。请帮忙。
  • 看起来csv.DictReader 会很有用。
  • “拆分列名”是什么意思?请告诉我们您卡住的步骤:读取文件,读取第一行,将该行拆分为列名(这是您的意思吗?),读取其他行,将这些行拆分为值,创建嵌套字典,或者是其他东西?如果您的问题是拆分第一行,请在该点之前和之后尽可能多地向我们展示您的代码。

标签: python python-3.x


【解决方案1】:

您可以使用csv.DictReader 从您的数据文件中创建一个 OrderedDicts 列表。然后您可以重新排列和转换您的数据以使嵌套字典满足您的要求。这是一个使用字典理解的示例。

import csv

with open('text.csv') as f:
    reader = csv.DictReader(f)
    result = {
        int(d['KEY']):{k: int(v) if v.isdigit() else v for k, v in d.items() if k != 'KEY'}
        for d in reader if d['KEY'].isdigit()}
    print(result)

编辑:如果您只需要 Tanmay 的解决方案中发布的 string 值,那么使用更少的代码就可以做到这一点。

import csv
from pprint import pprint

with open('text.csv') as f:
    results = {d.pop('KEY'): dict(d) for d in csv.DictReader(f)}
pprint(results)

编辑 2:转换值

import csv
from pprint import pprint
import re


def cast_dict(d: dict):
    def cast_value(value: str):
        if value.isdigit():
            return int(value)
        elif re.match(r'^\d+\.\d+$', value):
            return float(value)
        return value
    return {k: cast_value(v) for k, v in d.items()}


with open('text.csv') as f:
    results = {int(d.pop('KEY')): cast_dict(d) for d in csv.DictReader(f) if d.get['KEY'].isdigit()}

pprint(结果) pprint(结果)

【讨论】:

  • 谢谢先生,这正在工作。
  • 我没有足够的代表点来评论 Tanmay 的解决方案,所以我会在这里发表评论......虽然它使用了一些更简单的逻辑,但大多数人会认为它是“unpythonic”。它也不符合您的设计条件,因为它不会将字符串数字转换为整数。如果您只需要字符串,那么“pythonic”解决方案就更容易了。请参阅上述答案中的编辑。
  • 先生,您的解决方案最适合我的情况。但是我现在面临的问题是我有几行浮动,这些浮动也被标记为字符串。我希望 Int() 作为整数和 float() 作为浮点数。你能帮我解决这个问题吗?
  • 您需要提供一些示例数据...
  • 我的分数很少作为浮点数的示例数据:KEY,NAME,RANK,BOOKNAME,SCORE,AUTHER 123,ABCD,500,FREEDOM1,15200,PXYZ 133,EFGH,400,FREEDOM2,15300.5, XTYZ nan,SYGH,700,FREEDOM3,15400,RYYZ 143,LKMN,800,FREEDOM4,15500.5,XYCZ
【解决方案2】:

你可以像这样使用csv 模块。如果需要检查 KEY 值是否为数字,则创建相应的函数:

import csv

def is_float(s):
    try:
        float(s)
    except ValueError:
        return  False
    return True


with open('input.csv') as f:
    reader = csv.DictReader(f)
    rows = list(dict(a) for a in iter(reader) if is_float(a['KEY']))

print(rows)

【讨论】:

    【解决方案3】:

    实现目标需要做的事情是

    首先你需要知道如何打开文件(假设它的 .txt 文件包含逗号分隔值)

    filename = "csv_data.txt"
    file = open(filename, "r") #opening in read mode
    line_list = []
    for line in file:
       print(line) #line_list.append(line.strip().split(','))
    

    那么你会想要使用','作为分隔符来分割字符串(line),你必须这样做line.split(',')这会给你列表。

    line_list[0] 
    

    您将在此处找到文本文件第 1 行中所有字符串的列表。

    好的,我已决定添加代码,但请不要复制粘贴尝试通过谷歌了解它或转到 python 文档查看每个内置函数的作用。

    from collections import defaultdict
    
    filename = "csv_data.txt"
    file = open(filename, "r") #opening in read mode
    line_list = []
    output_dict = defaultdict(dict) #read about defualtdict vs dict
    
    for line in file:
        #print(line,end='')
        line_list.append(line.strip().split(','))
    
    
    key_names = line_list[0] #remember firstline in our file contains name of keys
    
    #read about slicing
    for line in line_list[1:]:
        #print(line)
        this_key = line[0]
        if this_key == 'nan':
            continue #we don't want to add this to our dict
    
        else:
            this_key = int(this_key)
            output_dict[this_key]= defaultdict(dict)
    
            # read about enumerate
            for i,word in enumerate(line[1:], start = 1):
    
                this_key_dict =  output_dict[this_key]   
                if key_names[i] == 'SCORE' or key_names[i] == 'RANK':
                    try:
                       word = int(word)
    
                    except ValueError:
                       word = float(word)  
    
                this_key_dict[key_names[i]] = word
    
    
    
    
    def nice_print(dict_d):
    
        for i,v in dict_d.items():
            print(i,v)
    
    
    nice_print(output_dict)
    
    
    >>> word = '7.8'
    >>> float(word) if '.' in  word else int(word)
    7.8
    >>> word = '7'
    >>> float(word) if '.' in  word else int(word)
    7
    >>>
    

    【讨论】:

    • 谢谢先生。理解逻辑。
    • @Pravat 如果您在使用浮动时遇到问题,那么现在它应该可以工作了,顺便说一句,您应该提到密钥可以是浮动的
    • 不,先生,KEY 和 RANK 是整数。但 SCORE 可以是浮动的。
    • 哦抱歉没注意
    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 2013-03-02
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多