如何获取列表并将其解析为类中的对象列表?(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())
你正在准备的文件中的一行是什么样子,你能给我们举个例子吗?你知道如何实例化条目
对象吗?我建议去试试