如何获取列表并将其解析为类中的对象列表?(Python)

如何获取列表并将其解析为类中的对象列表?(Python),python,list,file,class,Python,List,File,Class,我有一个包含多个对象的类。我应该获取一个文本文件,打开它并将其解析为一个对象列表,然后返回条目对象列表 我正在努力理解如何将我从文件中创建的列表转换为对象列表 class Entry: def __init__(self, account_num, name, balance, phone, city): self.account_num = account_num self.name = name self.balance = bala

我有一个包含多个对象的类。我应该获取一个文本文件,打开它并将其解析为一个对象列表,然后返回条目对象列表

我正在努力理解如何将我从文件中创建的列表转换为对象列表

class Entry:

    def __init__(self, account_num, name, balance, phone, city):
        self.account_num = account_num
        self.name = name
        self.balance = balance
        self.phone = phone
        self.city = city

def read_file(file_given):
    open_file = open(file_given)
    entry_obj = []
    for line in open_file:
        word = line.split()
        entry_obj.append(word)
    open_file.close()
    return entry_obj
我正在读取的文本文件包含:

100  Alan   Jones   348.17  8053564820      SLO
700  Suzy   Green   -14.22  8052586912      SLO

也许像这样的东西应该有用:

def map_to_entry(line):
    attribute_list = line.split()
    account_num = attribute_list[0]
    name = "{} {}".format(attribute_list[1], attribute_list[2])
    balance = attribute_list[3]
    phone = attribute_list[4]
    city = attribute_list[5]
    
    return Entry(account_num, name, balance, phone, city)

def read_file(file_given):
    open_file = open(file_given)
    entry_obj = []
    for line in open_file:
        entry_obj.append(map_to_entry(line))
    open_file.close()
    return entry_obj

也许像这样的东西应该有用:

def map_to_entry(line):
    attribute_list = line.split()
    account_num = attribute_list[0]
    name = "{} {}".format(attribute_list[1], attribute_list[2])
    balance = attribute_list[3]
    phone = attribute_list[4]
    city = attribute_list[5]
    
    return Entry(account_num, name, balance, phone, city)

def read_file(file_given):
    open_file = open(file_given)
    entry_obj = []
    for line in open_file:
        entry_obj.append(map_to_entry(line))
    open_file.close()
    return entry_obj

它可以像使用一样简单

objList = [Entry(*li) for li in data]
但可悲的是,由于某些原因,你的名字像这样分开了
Alan Jones
并创建一个如下列表

[['100', 'Alan', 'Jones', '348.17', '8053564820', 'SLO'], ['700', 'Suzy', 'Green', '-14.22', '8052586912', 'SLO']]
因此,我们将得到错误,
TypeError:\uuuu init\uuuu()接受6个位置参数,但给出了7个
。 所以我们必须加入这些元素

new = []
for l in read_file():
    l[1:2] = [' '.join(l[1:3])]
    l.pop(2)
    new.append(l)
objList = [Entry(*li) for li in new]
对象列表将看起来像

[<__main__.Entry object at 0x7fe78db6a970>, <__main__.Entry object at 0x7fe78db6acd0>]
[,]

它可以像使用

objList = [Entry(*li) for li in data]
但可悲的是,由于某些原因,你的名字像这样分开了
Alan Jones
并创建一个如下列表

[['100', 'Alan', 'Jones', '348.17', '8053564820', 'SLO'], ['700', 'Suzy', 'Green', '-14.22', '8052586912', 'SLO']]
因此,我们将得到错误,
TypeError:\uuuu init\uuuu()接受6个位置参数,但给出了7个
。 所以我们必须加入这些元素

new = []
for l in read_file():
    l[1:2] = [' '.join(l[1:3])]
    l.pop(2)
    new.append(l)
objList = [Entry(*li) for li in new]
对象列表将看起来像

[<__main__.Entry object at 0x7fe78db6a970>, <__main__.Entry object at 0x7fe78db6acd0>]
[,]

您已经定义了类,但为了“实例化”(创建)类对象,现在必须调用该类。(在下面的示例中被视为
Entry()
,其中
()
让我们知道我们正在调用/调用该对象)

您肯定希望在init()方法中清楚地说明您的参数,就像您拥有它们一样。让事情简洁易懂是件好事。 *编辑-我分别将名称args更改为_first和_last。原因如下

请注意,在下面的示例中,循环变量line是一组完整的输入数据。因此,通过在前面使用星号,Python将查找一个列表(实际上是任何iterable),并将每个列表元素作为自己的参数自动发送到函数调用

e、 g.如果=='a b c',则
条目(*line.split())
等同于
条目('a','b','c')


**编辑-当然,这是假设我们知道数据列在接收时的顺序。有很多更可靠的方法可以使这段代码经得起未来的考验,但我离题了。

您已经定义了类,但为了“实例化”(创建)类对象,现在必须调用该类。(在下面的示例中被视为
Entry()
,其中
()
让我们知道我们正在调用/调用该对象)

您肯定希望在init()方法中清楚地说明您的参数,就像您拥有它们一样。让事情简洁易懂是件好事。 *编辑-我分别将名称args更改为_first和_last。原因如下

请注意,在下面的示例中,循环变量line是一组完整的输入数据。因此,通过在前面使用星号,Python将查找一个列表(实际上是任何iterable),并将每个列表元素作为自己的参数自动发送到函数调用

e、 g.如果=='a b c',则
条目(*line.split())
等同于
条目('a','b','c')


**编辑-当然,这是假设我们知道数据列在接收时的顺序。有很多更可靠的方法可以让这段代码经得起未来的考验,但我离题了。

您可以在迭代过程中解包所有元素。如果您的姓名始终假定为名字和姓氏,则可以在创建条目对象之前将它们连接起来。以下示例可读性很强:

entries = []
for account_num, first_name, last_name, balance, phone, city in read_file('data.txt'):
  name = first_name + " " + last_name
  entries.append(Entry(account_num, name, balance, phone, city))
如果您喜欢,还可以使用一行:

entries = [Entry(account_num, first_name + " " + last_name, balance, phone, city) for account_num, first_name, last_name, balance, phone, city in read_file('ok.txt')]
python中的解包意味着获取一个您事先知道大小的iterable,并将每个元素解包到不同的变量中。比如:

a, b, c = ['a', 'b', 'c']
同样的思想也可以应用于for循环中的元素,在for循环中,元素本身是另一个iterable(固定大小),就像文件中的每一行一样。这允许您将列表转换为命名变量,这些变量通常更易于阅读

如果您最初的问题是修改
read_file
函数,您可以使用类似的想法,在迭代文件时解包:

def read_file(file_given):
    open_file = open(file_given)
    entry_obj = []
    for line in open_file:
        account_num, first_name, last_name, balance, phone, city = line.split()
        name = first_name + " " + last_name
        entry_obj.append(Entry(account_num, name, balance, phone, city))
    open_file.close()
    return entry_obj

您可以在迭代过程中解压缩所有元素。如果您的姓名始终假定为名字和姓氏,则可以在创建条目对象之前将它们连接起来。以下示例可读性很强:

entries = []
for account_num, first_name, last_name, balance, phone, city in read_file('data.txt'):
  name = first_name + " " + last_name
  entries.append(Entry(account_num, name, balance, phone, city))
如果您喜欢,还可以使用一行:

entries = [Entry(account_num, first_name + " " + last_name, balance, phone, city) for account_num, first_name, last_name, balance, phone, city in read_file('ok.txt')]
python中的解包意味着获取一个您事先知道大小的iterable,并将每个元素解包到不同的变量中。比如:

a, b, c = ['a', 'b', 'c']
同样的思想也可以应用于for循环中的元素,在for循环中,元素本身是另一个iterable(固定大小),就像文件中的每一行一样。这允许您将列表转换为命名变量,这些变量通常更易于阅读

如果您最初的问题是修改
read_file
函数,您可以使用类似的想法,在迭代文件时解包:

def read_file(file_given):
    open_file = open(file_given)
    entry_obj = []
    for line in open_file:
        account_num, first_name, last_name, balance, phone, city = line.split()
        name = first_name + " " + last_name
        entry_obj.append(Entry(account_num, name, balance, phone, city))
    open_file.close()
    return entry_obj

文件的输入格式是什么?你能在你的帖子中包含文件内容吗?看起来像
entry\u obj.append(word)
可能需要是
entry\u obj.append(entry(*line.split())
你正在准备的文件中的行是什么样子的,你能给我们举个例子吗?你知道如何实例化
entry
对象吗?我建议您阅读python文档:。一旦你可以实例化一个对象,你只需要附加该对象。文件的输入格式是什么?你能在你的帖子中包含文件内容吗?看起来像
entry\u obj.append(word)
可能需要是
entry\u obj.append(entry(*line.split())
你正在准备的文件中的一行是什么样子,你能给我们举个例子吗?你知道如何实例化
条目
对象吗?我建议去试试