从python中的文本文件创建类实例

时间:2011-11-28 05:16:37

标签: python file instances

我有一个多项式类:

class Polynomial:
    def __init__(self, *termpairs):
        self.termdict = dict(termpairs)

要向此类添加实例,请输入以下内容:

P = Polynomial((3,2), (4,5), (9,8))

现在我正在尝试创建一个从文本文件中读取信息的函数,并从该文本文件中创建一个Polynomial类的实例。信息存储在文本文件中,如下所示:

4 6
2 3
9 8
3 5
0 42

到目前为止,函数看起来像这样:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly1 = polyfilename.read()
    polyfilename.close()
    poly1 = [line.split() for line in poly1.split("\n")]
    poly1 = [[int(y) for y in x] for x in poly1]
    for item in poly1:
        return Polynomial(item)

它只为文本文件中的第一对创建一个Polynomial实例,如何为文本文件中的所有配对创建一个Polynomial实例?

编辑: 我现在将此作为我的功能:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly = polyfilename.read()
    polyfilename.close()
    poly = [line.split() for line in poly.split("\n")]
    poly = [[int(y) for y in x] for x in poly]
    return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

它给了我正在寻找的答案,但是,这些文本文件的长度可能会有所不同,因此键入poly [1],poly [2]将不起作用。无论长度是多少,我都可以通过每个索引吗?

3 个答案:

答案 0 :(得分:1)

return总是在调用后立即退出函数,并且只能返回一个项目。因此,如果您想要返回多个项目(在某种意义上),您必须将它们打包在列表中,然后返回。

取代for循环:

polys = []
for item in poly1:
    polys.append(Polynomial(item))
return polys

你当然必须以清单的形式处理这个新结果。

答案 1 :(得分:1)

你需要的只是

return Polynomial(*poly)

而不是

return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

文档here ...读取以“”开头的段落“如果语法*表达式出现在函数调用中”“”

Bonus:你的函数不使用它的arg,重用名称poly就像疯了一样,并不是惯用的,所以我重写了整个事情:

def read_file(polyfilename):
    with open(polyfilename) as f:
        return Polynomial(*[[int(x) for x in line.split()] for line in f])

HTH

答案 2 :(得分:0)

快速浏览一下,看起来这是在创建第一个之后返回的,所以你只能得到一个。尝试将return语句替换为yield,然后:

for p in read_file('somefile'):
  # p is a polynomial object, do what you will with it

如果有帮助the first response here是对收益率的一个很好的总结。再一次,这只是通过快速查看你所写的内容。

    def read_file(polyfilename):
        polyfilename = open(polyfilename, "r")
        poly1 = polyfilename.read()
        polyfilename.close()
        poly1 = [line.split() for line in poly1.split("\n")]
        poly1 = [[int(y) for y in x] for x in poly1]
        for item in poly1:
            yield Polynomial(item)

    for p in read_file('sample.txt'):
        print p

可生产

<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>