Python:从文件中读取行,拆分它并更改对象

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.

假设我有一个包含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.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’未定义”。你能帮帮我吗?