2010-11-20 3 views
0

ファイルがある場合、どのように関数を実装して1行と複数行を読むことができますか?ファイル内にマルチプルラインやシングルラインを処理する関数

誰かがpythonの初心者キーワードを使用できるかどうかはわかりません(yieldを使用しない、break、continueなど)。

私自身のバージョンでは、実際には4つの関数を定義しました。 4つの関数のうち3つはヘルパー関数です。

と私は関数が返すようにしたい:

dict = {'TimC':{'name':Tim Cxd, 'location':'USA', 'Web':'http://www.TimTimTim.com', 'bio':'TimTim facebook!','follows': ['Charles','Dwight']}, 'Mcdon':{'name':Mcdonald , 'location':'Africa', 'Web':'', 'bio':'','follows': ['Moon','King']}} 

答えて

0

反復各種データを収集し、ファイルを通り、あなたが適切な見張りに達したときにそれをもたらします。

1
from itertools import izip 

line_meanings = ("name", "location", "web") 
result = {} 
user = None 

def readClean(iterable, sentinel=None): 
    for line in iterable: 
     line = line.strip() 
     if line == sentinel: 
      break 
     yield line 

while True: 
    line = yourfile.readline() 
    if not line: 
     break 
    line = line.strip() 
    if not line: 
     continue 
    user = result[line] = {} 
    user.update(izip(line_meanings, readClean(yourfile))) 
    user['bio'] = list(readClean(yourfile, 'ENDBIO')) 
    user['follows'] = set(readClean(yourfile, 'END')) 

print result 

{'Mcdon': {'bio': [''], 
      'follows': set(['King', 'Moon']), 
      'location': 'Africa', 
      'name': 'Mcdonald', 
      'web': ''}, 
'TimC': {'bio': ['TimTim facebook!'], 
      'follows': set(['Charles', 'Dwight']), 
      'location': 'USA', 
      'name': 'Tim Cxe', 
      'web': 'http://www.TimTimTim.com'}} 
0
import sys 

def bio_gen(it, sentinel="END"): 
    def read_line(): 
     return next(it).partition("#")[0].strip() 

    while True: 
     key = read_line() 
     ret = { 
      'name': read_line(), 
      'location': read_line(), 
      'website': read_line(), 
      'bio': read_line(), 
      'follows': []} 
     next(it)     #skip the ENDBIO line 
     while True: 
      line = read_line() 
      if line == sentinel: 
       yield key, ret 
       break 
      ret['follows'].append(line) 

all_bios = dict(bio_gen(sys.stdin)) 
import pprint 
pprint.pprint(all_bios) 

{'Mcdon': {'bio': '', 
      'follows': ['Moon', 'King'], 
      'location': 'Africa', 
      'name': 'Mcdonald', 
      'website': ''}, 
'TimC': {'bio': 'TimTim facebook!', 
      'follows': ['Charles', 'Dwight'], 
      'location': 'USA', 
      'name': 'Tim Cxe', 
      'website': 'http://www.TimTimTim.com'}} 
+0

コードは 'bio'は、正しい' ENDBIO' – nosklo

+0

@noskioまで以上1行可能性があり、問題があることを考慮していませんしかしOPはbioがリストではなく文字列でなければならないことを示しています。私は推測することを断ることを選んだ。 1行以上の生物がある場合に何が起こるべきかを示す質問が更新されたら、私は自分の答えを更新することができます –

関連する問題