2016-08-15 10 views
0

txtファイルを繰り返し処理するコードを作成しようとしています。ループ(python)でnext()を使用して次の行を取得できません

テキストファイルはそうのようになります。

mimi 
passwordmimi 
mimi johnson 
somejob 
joji 
passwordjoji 
jojo 
somejob 
john 
passwordjohn 
jonathan 
somejob 
.... 

のように。このテキストファイルには、基本的にユーザー情報(ログイン用)が含まれています。私はみんなのユーザー名のプリントアウトとその本名(例:mimiとmimi johnson。)とそれらのものだけを作る必要があります。私は(この例では:譲二)をプリントアウトするために、現在のユーザーの情報を望んでいないここ

を私のコードです:

username="joji" 

file=open("username.txt","r") 
x=file.readlines() 

x=[item.rstrip('\n') for item in x] 

x=iter(x) 

for line in x: 
     if line==username: 
       next(x,None) 
       next(x,None) 
       next(x,None) 
     else: 
       print line + " username" ****username should print out. ex:mimi or john 
       next(x,None) 
       print line +" real name ****real name should print out. ex: mimi johnson or jonathan 

何らかの理由で、私はこのプログラムを実行すると、私は2番目をプリントアウトするとき* ***私は、それはユーザー名の2回を出力します。 (その例:

mimi username 
mimi real name 
mimi johnson username 
mimi johnson real name 
john username 
john real name 
jonathan username 
jonathan real name 
.... 

理由です、それは、誰かが私を助けることができれば、私はパイソンを得るいけない、本当に感謝されると思います

mimi username 
mimi johnson real name 
john username 
jonathan realname 
... 

をプリントアウトする必要があり イムも、他に開いています?。 。この

EDITを行うための提案:::私は、これは結果で示唆変化を作ってみました:コードの

新しいブロック:

else: 
     print line + "username" 
     line =next(x,None) 
     print line 

これは新しい結果である:

mimi username 
passmimi real name 
mimi johnson username 
somejob real name 
john username 
passjohn real name 
jonathan username 
somejob real name(***im assuming this one is from john's job) 

:/そのやっていないものをそのはず

へ 私は、このファイル解析する正規表現を使用することをお勧めします
+4

'next()'を呼び出すと、 'line'の値は変更されません。 –

+0

それはありませんか?それでは、何が最善の方法だろうか。 – harekuin

+2

その場合、 'next'の戻り値を取得する必要があると思います。例えば'line = next(x)' –

答えて

1

import re 

# regex expression to parse the file as you provided it 
# you could access the parseddata as a dict using the 
# keys "username", "password", "real_name" and "job" 
ex = "\n*(?P<username>.+)\n(?P<password>.+)\n(?P<real_name>.+)\n(?P<job>.+)[\n\$]" 

with open("usernames.txt", 'r') as users: 
    matches = re.finditer(ex, users.read()) 
    for match in matches: 
     user = match.groupdict() # user is a dict 

     # print username and real name 
     print(user['username'], "username", user['real_name'], "real name") 

を編集します。 :私はこのファイルの形式が非常に単純なので、正規表現は実際には必要ないと考えました。正規表現を使わないと同じことがここにあります。

def parse(usersfile): 
    # strip line break characters 
    lines = (line.rstrip('\n') for line in usersfile) 

    # keys to be used in the dictionnary 
    keys = ('username', 'password', 'real_name', 'job') 

    while True: 
     # build the user dictionnary with the keys above 
     user = {key: line for key, line in zip(keys, lines)} 

     # yield user if all the keys are in the dict 
     if len(user) == len(keys): 
      yield user 
     else: # stop the loop 
      break 

with open("usernames.txt", 'r') as usersfile: 
    for user in parse(usersfile): 
     # print username and real name 
     print(user['username'], "username", user['real_name'], "real name") 
+0

これはリストの項目の前にユーザー名とパスワードがあると仮定していますか? (テキストファイルのように) – harekuin

+0

最初の行はユーザー名、2番目はパスワード、3番目は実名、4番目はジョブとみなします。これがあなたが意味するものなら、はい。 ;) – odrling

+0

私は読むことができません。あまりにも多くの私は、すべてのことをループして、このコードから学ぶつもりですありがとう! – harekuin

関連する問題