1

したがって、現在、次のような accounts.txt ファイルを読み取るためのこのコードがあります。

username1:password1
username2:password2
username3:password3

次に、これを (ここのメンバーのおかげで) accounts.txt ファイルを読み取り、ユーザー名とパスワードで分割して、後で印刷できるようにします。このコードでユーザー名とパスワードを分けて1行目を印刷しようとすると:

with open('accounts.txt') as f:

    credentials = [x.strip().split(':') for x in f.readlines()]



for username,password in credentials:

    print username[0]
    print password[0]

これは次のように出力されます。

j
t
a
2
a
3

(これらはテキストファイルにある3行で、適切に分割されていますが、すべての行と各行の最初の文字のみが印刷されています。)

私はいくつかの異なる方法を試しましたが、うまくいきませんでした。何をすべきか考えている人はいますか?

いつもお世話になっております。本当に感謝しています。これは私の 2 日目のプログラミングであり、このような単純な質問で申し訳ありません。

4

2 に答える 2

7

usernameそしてpassword文字列です。これを文字列に対して行うと、文字列の最初の文字が取得されます。

username[0]

そうしないでください。ただprint username

いくつかの追加説明。credentials文字列のリストのリストです。印刷するとこんな感じ。

[['username1', 'password1'], ['username2', 'password2'], ['username3', 'password3']]

ユーザー名とパスワードのペアを 1 つ取得するには、次のようにしますprint credentials[0]。結果は次のようになります。

['username1', 'password1']

またはprint credentials[1]、これを行った場合:

['username2', 'password2']

また、for ループで行う「アンパック」と呼ばれる処理を実行することもできます。for ループの外側でも実行できます。

username, password = credentials[0]
print username, password

結果は次のようになります

username1 password1

繰り返しになりますが、次のような文字列'username1'を取得し、その単一の要素を次のように取得すると:

username[0]

あなたは一文字を取得します, u.

于 2012-01-31T02:39:30.970 に答える
2

withまず、これが 2 日目のプログラミングである場合は、ステートメントとリストの内包表記を使用して、良いスタートを切ることができます。

他の人がすでに指摘しているよう[]に、ing を含む変数でインデックス付けを使用しているため、それが配列であるかstrのように扱わstrれるため、指定したインデックスで文字が取得されます。

私はいくつかのことを指摘したいと思いました:

1)ファイルオブジェクトは反復可能なオブジェクトであるf.readline()ため、ファイルを反復処理するために使用する必要はありません(で確認できるメソッドが定義されています。したがって、これを行うことができます:f__iter__getattr(f, '__iter__')

with open('accounts.txt') as f:
    for l in f:
        try:
            (username, password) = l.strip().split(':')
            print username
            print password
        except ValueError:
            # ignore ValueError when encountering line that can't be
            # split (such as blank lines).
            pass

2) あなたはまた、「ファイルの最初の行だけを印刷する方法があるかどうか知りたいですか? または、その場合、2 番目、3 番目などを選択して印刷する方法はありますか?」と述べました。

パッケージのislice(iterable[, start], stop[, step])関数は、itertoolsたとえば、2行目と3行目だけを取得するのに最適です(インデックスは0から始まることに注意してください!!!):

from itertools import islice
start = 1; stop = 3
with open('accounts.txt') as f:
    for l in islice(f, start, stop):
        try:
            (username, password) = l.strip().split(':')
            print username
            print password
        except ValueError:
            # ignore ValueError when encountering line that can't be
            # split (such as blank lines).
            pass

または、 1 行おきに取得するには:

from itertools import islice
start = 0; stop = None; step = 2
with open('accounts.txt') as f:
    for l in islice(f, start, stop, step):
        try:
            (username, password) = l.strip().split(':')
            print username
            print password
        except ValueError:
            # ignore ValueError when encountering line that can't be
            # split (such as blank lines).
            pass

itertools (およびそのレシピ!!!)を学ぶことに時間を費やしてください。コードを簡素化します。

于 2012-01-31T04:03:09.843 に答える