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

Python: Read line from file, split it and change object

假设我有一个包含 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]

所有的工作都发生在最后一行。文件中的列表理解为您提供了行列表。每行在 : 上拆分并通过解包传递给 Record 构造函数。

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

对于简单的 类(比如你的),collections.namedtuple 通常很有用:

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

试试这个代码。我试图让它非常 pythonistic 仍然接近你从 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())