读取文件并将内容插入词典

2024-04-25 22:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含餐馆信息的文本文件,需要做的是,将此信息插入到几个字典属性包括名称、等级、价格范围、烹饪类型

以下是txt的内容

Georgie Porgie 
87% 
$$$ 
Canadian,Pub Food

Queen St. Cafe 
82% 
$ 
Malaysian,Thai

到目前为止,我已经阅读了文件,并抓起一个列表的内容。你知道吗

content = [];
with open(file) as f:
        content = f.readlines();
        content = [x.strip() for x in content];

需要插入三本词典 名字,价格,菜名,我该怎么办?你知道吗


Tags: txt名称信息类型内容字典属性价格
3条回答

给定文本文件的最新格式规范:

Georgie Porgie 
87% 
$$$ 
Canadian,Pub Food

Queen St. Cafe 
82% 
$ 
Malaysian,Thai

如果你能假设:

  • 每一个餐厅条目总是由四行定义,每行包含您要查找的字段(阅读:dictionary entries)
  • 字段总是以相同的顺序出现
  • 每个条目将始终由下一个条目通过空行分隔

然后您可以使用modulo operation并执行以下操作:

import re

content = {}
filepath = 'restaurants_new.txt'
with open(filepath, 'r') as f:
    fields = ['name', 'rating', 'price', 'cuisine']
    name = ''
    for i, line in enumerate(f):
        modulo = i % 5
        raw = line.strip()
        if modulo == 0:
            name = raw
            content[name] = {}
        elif modulo < 4:
             content[name][fields[modulo]] = raw
        elif modulo == 4:
            # we gathered all the required info; reset
            name = ''

from pprint import pformat
print pformat(content)

编辑: 以下解决方案是在您最初发布的格式设置之后提出的,如下所示:

Georgie Porgie 87% $$$ Canadian,Pub Food
Queen St. Cafe 82% $ Malaysian,Thai

我把原来的答案留在这里,以防对其他人仍然有用。你知道吗

作为JohanL mentioned in his comment,解决问题的最简单的方法是行格式:根据分隔符是逗号还是空格,或者两者的组合,考虑到餐厅的名称可能包含未知数量的单词,找到如何拆分行可能会变得很棘手。你知道吗

这里有一个与@gaurav建议的稍微不同的方法,使用regular expressionsre模块):

import re

content = {}
filepath = 'restaurants.txt'
dictmatch = r'([\s\S]+) ([0-9]{1,3}\%) (\$+) ([\s\S]+)'
with open(filepath, 'r') as f:
    for line in f:
        raw = line.strip()
        match = re.match(dictmatch, raw)
        if not match:
            print 'no match found; line skipped: "%s"' % (raw, )
            continue
        name = match.group(1)
        if name in content:
            print 'duplicate entry found; line skipped: "%s"' % (raw, )
            continue
        content[name] = {
            "rating": match.group(2),
            "price": match.group(3),
            "cuisine": match.group(4) 
        }

from pprint import pformat
print pformat(content)

假设您对源txt没有控制权,这种方法的优点是您可以定制regex模式以匹配它所附带的任何“非最佳”格式。你知道吗

看到您给出的文件示例,元素是以空格分隔的。你知道吗

所以,你的任务是:

  • 打开文件
  • 读每一行
  • 拆分空格上的条目
  • 把词条存到字典里

具体做法如下:

names_rating = {}
price_names = {}
cuisine_names = {}
with open(file) as f:
    lines = []
    for line in f:
        content = f.readline().rstrip()
        if content != ''
            lines.append(content)
        if len(lines) > 4 :
            name = lines[0]
            rating = lines[1]
            price = lines[2]
            cuisine = lines[3].split(',')
            names_rating[name] = rating
            price_names[name] = price
            cuisine_name[name] = cuisine
            lines = []

在这种情况下,文件被逐行读取,结果被附加到一个列表lines。当列表的大小超过4时,所有属性都被读入列表。然后对它们进行处理,将数据保存在字典中。然后清空列表,以便再次执行该过程。你知道吗

一般来说,要从列表list_of_lists构建词典列表lists_of_dicts,将索引i处的项映射到索引j处的项,可以使用如下dict comp:

list_of_dicts = {lst[i]: lst[j] for lst in list_of_lists}

您应该能够将此应用于任意list_of_lists以解决您的问题。你知道吗

相关问题 更多 >