如何使用从文本文件读取的属性创建类实例?

2024-09-29 05:28:07 发布

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

我当前有一个文本文件,其中保存的数据如下:

surname1
name1
number1
address1
surname2
name2
number2
address2
...

我想使用此文本文件在我的类中创建实例:

class Contact(object):

    def __init__(self, surname, name, number, address):
        self.surname = surname
        self.name = name
        self.number = number
        self.address = address

我需要一个函数,可以从文本文件读取,使用4行作为一个新实例的属性,将该实例附加到一个列表中,然后在接下来的4行中再执行一次,依此类推…如何做到这一点?你知道吗


Tags: 数据实例nameselfnumberaddresssurname文本文件
2条回答

基本上,输入文件的每一行都表示一个属性的值。您可以通过读取分组中的行,然后将这些行传递到Contact类构造函数中,从而在代码中对其进行镜像。你知道吗

我的意思是:

class Contact:
    fields = 'surname', 'name', 'number', 'address'

    def __init__(self, surname, name, number, address):
        self.surname = surname
        self.name = name
        self.number = number
        self.address = address

    def __repr__(self):
        return '{}({})'.format(self.__class__.__name__,
                               ', '.join(getattr(self, field)
                                            for field in self.fields))

filename = 'class_data.txt'
contacts = []
with open(filename) as file:
    try:
        while True:
            fields = [next(file).strip() for _ in range(len(Contact.fields))]  # Read group.
            contacts.append(Contact(*fields))
    except StopIteration:  # end-of-file
        pass

from pprint import pprint
pprint(contacts)

输出:

[Contact(surname1, name1, number1, address1),
 Contact(surname2, name2, number2, address2),
 Contact(surname3, name3, number3, address3)]

可以使用more-itertools'sliced()方法将iterable分为相等的块:

import more_itertools

contacts = []

class Contact:

    def __init__(self, surname, name, number, addr):
        self.surname = surname
        self.name = name
        self.number = number
        self.addr = addr

with open('file.txt', 'r') as f:
    content = f.read().split('\n')
    for x in more_itertools.sliced(content, 4):
        c = Contact(*x)
        contacts.append(c)

相关问题 更多 >