ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python:从文件中读取多行并将实例存储在字典中

2019-11-18 21:58:45  阅读:513  来源: 互联网

标签:list dictionary for-loop readline python


我的挣扎:

阅读两行,跳过第三行.

然后,我想将所有对象存储在以名称为键的字典中.

**** Ingredients.txt ****
Name1
ingredient1/ingredient2/ingredient3

Name2
ingredient1/ingredient2

Name3
...
class Foodset(object):
    def __init__(self, name):
        self.name = name
        self.ingredients = set([])

    def __str__(self):
        return str(self.name) + ' consits of: ' + ", ".join(str(e) for e in self.ingredients) + '.'

    def setIngredients(self, list):
        for i in list:
            self.ingredients.add(i)

def getMenu(file="ingredients.txt"):
    with open(file, 'r') as indata:
        menu = dict()
        for line in indata:
            tempString = str(line.rstrip('\n'))
            menu[tempString] = Foodset(tempString)

我想阅读下一行并将其存储为配料,然后跳过第三行,因为它是空白.然后重复.

我在for循环中遇到的问题是,我无法在同一循环中存储两条不同的线,然后再引用同一对象才能使用setIngredients()方法.我还可以通过哪些其他方式读取每个循环中的多行内容?

编辑:
@Arpan提供了一个快速解决方案,可以使用indata.readlines()列出每行并以3的步长循环,同时存储第一个和第二个值,并跳过第三个值.

我刚刚在while循环中使用了readline()方法3次,提出了另一个解决方案.使用readline()是我最初想要的.

def getMenu(menu="ingredients.txt"):
    with open(menu, "r") as indata:
        menu = dict()
        while True:
            name = indata.readline().strip('\n')
            ingredientList = indata.readline().strip().split('/')
            if name == "":
                break
# here I just added a parameter that directly set the attribute "ingredients" inside the object.
            menu[name] = Foodset(name, ingredientList)
            indata.readline()
    return menu

解决方法:

尝试这样的事情.

with open(file, 'r') as indata:
    lines = indata.readlines()
menu = dict()
for i in xrange(0, len(lines), 3):
    name = lines[i].rstrip('\n')
    ingredients = lines[i+1].rstrip('\n').split('/')
    f = Foodset(name)
    f.setIngredients(ingredients)
    menu[name] = f

对于python 3.x,请使用range而不是xrange.

标签:list,dictionary,for-loop,readline,python
来源: https://codeday.me/bug/20191118/2031220.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有