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