0

我的问题如下:我有一个 100 行的文本,每行包含姓氏、名字和一个房间,格式为“姓氏,名字房间”,房间包含 3 个元素“建筑,floor,office" 像 "A.15.10" 所以一条完整的线将是

   "name, name A.15.10"

我想制作一个具有“A.15.10”之类的属性建筑物、楼层、办公室和储藏室的教室。具有 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] 以使建筑物具有地板和房间之后。我怎么能按班级拥有所有这些。对不起,如果我没有很好地解释这个问题。

4

4 回答 4

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
于 2012-06-14T18:34:49.150 回答
0

创建一个具有所有必需属性的教室。对于构造函数,您有几个选择。

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('.')
于 2012-06-14T18:18:17.383 回答
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()
于 2012-06-14T18:32:27.627 回答
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 有点太慢了;)

于 2012-06-14T18:42:17.403 回答