Python:从文件中读取行,拆分它并更改对象
假设我有一个包含1000行的文本文件。它们都是这样的:Python:从文件中读取行,拆分它并更改对象,python,object,text-files,Python,Object,Text Files,假设我有一个包含1000行的文本文件。它们都是这样的: FirstName:SecondName:1:2:3:4 “:”可以替换为任何其他符号,我有1000个对象的列表: class RECORD: FNAME = "default" SNAME = "default" M1 = 0; M2 = 0; M3 = 0; M4 = 0; def outname(self): print (self.FNAME + self.
FirstName:SecondName:1:2:3:4
“:”可以替换为任何其他符号,我有1000个对象的列表:
class RECORD:
FNAME = "default"
SNAME = "default"
M1 = 0;
M2 = 0;
M3 = 0;
M4 = 0;
def outname(self):
print (self.FNAME + self.SNAME)
LIST = []
for i in range(1000):
LIST.append(RECORD(i))
所以,我想读取这个文件,用第一行的字符串和整数填充第一个对象,用第二行的字符串和整数填充第二个对象,等等。
我该怎么做 我想你正在寻找这样的东西:
class Record(object):
"""docstring for Record"""
def __init__(self, FNAME, SNAME, M1, M2, M3, M4):
super(Record, self).__init__()
self.FNAME = FNAME
self.SNAME = SNAME
self.M1 = M1
self.M2 = M2
self.M3 = M3
self.M4 = M4
with open('your_file_name') as f:
LIST = [Record(*(line.split(':'))) for line in f]
所有的工作都发生在最后一行。“文件上的列表理解”将为您提供行列表。每行在:
上拆分,并通过解包传递给记录构造函数。对于简单类(如您的类),集合。namedtuple通常很有用:
import csv
class Record(object):
def __init__(self, fname = 'default', sname = 'default', m1 = 0, m2 = 0, m3 = 0, m4 = 0):
self.fname = fname
self.sname = sname
self.m1 = int(m1)
self.m2 = int(m2)
self.m3 = int(m3)
self.m4 = int(m4)
def get_name(self):
return '{0} {1}'.format(self.fname, self.sname)
records = []
reader = csv.reader(open('file.txt', 'rb'), delimiter = ':')
for row in reader:
records.append(Record(*row))
for record in records:
print(record.get_name())
#FirstName SecondName
from collections import namedtuple
Record = namedtuple("Record", "FNAME SNAME M1 M2 M3 M4")
with open("records.txt") as record_file:
records = [Record(*line.split(':')) for line in record_file]
print records[3].FNAME # For example
此外,您可能希望将类似的项存储为序列,因此每个记录都是名称列表和整数列表。这里有一个版本可以做到这一点
from collections import namedtuple
from pprint import pprint
Record = namedtuple("Record", "names m")
records = []
with open("records.txt") as record_file:
for line in record_file:
line = line.split(':')
line = line[0:2] , [int(i) for i in line[2:]]
line = Record(*line)
records.append(line)
print records[3].names[0] # Same as first example
pprint (records) # pretty-print entire list
试试这个代码。我试着让它相当接近于你从C++所知道的。但是请试着让自己更加沉浸在Python中
class Person:
def __init__(self,
first_name='default',
second_name='default',
m1=0, m2=0, m3=0, m4=0):
self._first_name = first_name
self._second_name = second_name
self._m1 = m1
self._m2 = m2
self._m3 = m3
self._m4 = m4
def full_name(self):
return self._first_name + ' ' + self._second_name
if __name__ == '__main__':
INPUTFILE = 'persons.txt'
persons = list()
for line in open(INPUTFILE):
first_name, second_name, m1, m2, m3, m4 = line.strip().split(':')
persons.append(Person(first_name, second_name, m1, m2, m3, m4))
for person in persons:
print(person.full_name())
如果将:
替换为,例如,/
,您的程序如何知道?每行的符号是否可以更改?在每一行内?旁白:分号在这里是不必要的。谢谢,但是对象列表呢?我有一个1000行和1000个对象的文件。我应该把它放到循环中吗?我最近能调用任何列表对象,比如C++吗?我的意思是,我可以调用列表[1].FNAME或类似的东西吗?在这种情况下,列表将包含1000个Record类的对象。列表[1]是与文件中第二行相对应的对象。因此,LIST[1].FNAME确实会返回对应于该对象的名字。那么,这是否意味着我需要在一个循环中以某种方式将“for i in range(1000):”和“with open('marks.csv')作为f:”?或者它会自动创建对象,直到文件结束?对不起,又是些蹩脚的问题。不需要循环[f中的行对应行]
将返回一个行列表,如“FirstName:SecondName:1:2:3:4”<代码>[line.split(“:”)用于f中的行]
将返回一个列表列表,其中的元素有['FirstName'、'SecondName'、'1'、'2'、'3'、'4\n']。最后,我们对f中的行执行[Record(*(line.split(“:”)))
。每行中的单词列表将传递给构造函数。星型是需要的,因为构造函数需要很多参数,而不是一个列表参数。谢谢,但我认为构造函数有问题:当我启动程序时,python说“NameError:name'SNAME'没有定义”。我试图用M1任务交换它,但它仍然对SNAME感到愤怒。当我将SNAME重命名为SNAME时(括号内和“=”)后面会显示“NameError:name‘SNAME’未定义”。你能帮帮我吗?