0

私の問題は次のとおりです。100行のテキストがあり、各行には姓、名、および「姓、名の部屋」という形式の1つの部屋が含まれています。部屋は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

クラスを使用する代わりに、名前付きタプルがより単純な代替手段になる場合があります。正規表現を使用して、ファイルを 1 ステップで解析することもできます。

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

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') )

私のreスキル@Trevorが少し遅すぎます;)

于 2012-06-14T18:42:17.403 に答える
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

必要な属性をすべて備えたクラス ルームを作成します。コンストラクターには、いくつかのオプションがあります。

1) すべてのフィールドを取るコンストラクターを作成します。

2)ファイルから1行を文字列として取得するコンストラクターを作成し、コンストラクターはフィールドを分割して抽出します。

送信したコードに関するコメント:

   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 に答える