我的问题如下:我有一行100行,每行包含姓氏,给定名称和一个房间,形式为“姓氏,名字室”,房间包含3个房间元素“建筑物,地板,办公室”如“A.15.10”所以完整的一行将是
"name, name A.15.10"
我想创建一个具有属性建筑,地板,办公室和储藏室的教室,如“A.15.10”。具有属性familyname,givenname,room的类。我想将此文件中的所有信息加载到familyname,givenname,room数组并打印出来。直到现在没有上课的我做了什么。
file=open('file.txt','r')
data=file.readlines()
k=len(data)
c=list(range(k))
for i in range(k):
c=data.split()
for i in range(k):
d=c[i][2].split('.')
现在元素c [i] [0]是姓氏c [i] [1]给定名称,c [i] [3]是房间。在我再次拆分元素c [i] [3]以使建筑物成为地板和房间。我怎么能通过课程获得所有这些。对不起,如果我没有很好地解释这个问题。
答案 0 :(得分:1)
而不是使用类,namedtuples可能是一个更简单的替代方案。您还可以使用正则表达式一步解析文件:
import re
from collections import namedtuple
from itertools import starmap
Entry = namedtuple('Entry', ['familyname', 'givenname', 'building', 'floor', 'office'])
entry_re = re.compile(r'([^,]*), (.*) ([^\.]*)\.([^\.]*)\.([^\.]*)\n')
with open('file.txt','r') as f:
entries = starmap(Entry, entry_re.findall(f.read()))
for entry in entries:
print('familyname:', entry.familyname)
print('givenname:', entry.givenname)
print('building:', entry.building)
print('floor:', entry.floor)
print('office:', entry.office)
# Output:
# familyname: name
# givenname: name
# building: A
# floor: 15
# office: 10
答案 1 :(得分:0)
创建一个包含所有必需属性的类Room。对于构造函数,您有几个选项。
1)创建一个包含所有字段的构造函数。
2)创建一个构造函数,它从文件中取一行作为字符串,构造函数拆分并提取字段。
关于您发送的代码的评论:
file=open('file.txt','r')
data=file.readlines()
k=len(data)
c=list(range(k)) # You are never using c after assignment.
for i in range(k):
c=data.split() # You would want to split data[i] and not data
for i in range(k):
d=c[i][2].split('.') # This can go in the previous loop with
# d = c[2].split('.')
答案 2 :(得分:0)
这是使用类的代码的重构。如果没有关于预期输出的更多细节,很难说这是否完全满足您的需求。
class Room:
def __init__(self, building, floor, office):
self.building = building
self.floor = floor
self.office = office
class Entry:
def __init__(self, lastname, firstname, room):
self.lastname = lastname
self.firstname = firstname
self.room = room
entries = []
file=open('file.txt','r')
for line in file.readlines():
lastname, remaining = line.split(', ')
firstname, remaining = remaining.split(' ')
building, floor, office = remaining.split('.')
room = Room(building, floor, office)
entry = Entry(lastname, firstname, room)
entries.append(entry)
file.close()
答案 3 :(得分:0)
您可以使用re来解析文件。
finder = re.compile( r"""
(?P<last>\w+),\s+ # Last name
(?P<first>\w+)\s+ # First Name
(?P<building>[A-D]). # Building Letter
(?P<floor>\d+). # Floor number
(?P<room>\d+) # Room Number
""", re.VERBOSE )
for line in open( "room_names.txt", 'r' ):
matches = finder.match( line )
print( matches.group( 'last', 'first' ) )
print( matches.group( 'building' ,'floor','room') )
我的技能@Trevor的速度有点慢;)