Не удается распечатать конкретную строку из текстового файла - PullRequest
1 голос
/ 31 января 2012

Итак, у меня в настоящее время есть этот код для чтения файла account.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

(Это три строки, которые у меня есть втекстовый файл, правильно разделенный, однако он печатает все строки и только первые буквы каждой строки.)

Я пробовал несколько разных методов, но безуспешно.Кто-нибудь есть идеи о том, что делать?

Спасибо за вашу помощь.Это действительно ценится.Это мой второй день программирования, и я прошу прощения за такой простой вопрос.

Ответы [ 2 ]

7 голосов
/ 31 января 2012

username и password являются строками.Когда вы делаете это со строкой, вы получаете первый символ в строке:

username[0]

Не делайте этого.Просто print username.

Некоторое дальнейшее объяснение.credentials - список списков строк.При распечатке это выглядит так:

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

Чтобы получить одну пару имя пользователя / пароль, вы можете сделать это: print credentials[0].Результат будет следующим:

['username1', 'password1']

Или, если вы сделали print credentials[1], это:

['username2', 'password2']

Вы также можете сделать то, что называется "распаковка", что вам нужнопетля делает.Вы также можете сделать это вне цикла for:

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

Результат будет

username1 password1

И снова, если вы возьмете строку типа 'username1' и возьмете один элементэто так:

username[0]

Вы получаете одну букву, u.

2 голосов
/ 31 января 2012

Во-первых, я хотел бы сказать, если это ваш второй день программирования, то вы хорошо начали, используя оператор with и список пониманий уже!

Как уже отмечали другие люди, так как вы используете индексирование [] с помощью переменной, содержащей 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) Вы также упомянули, что вам «любопытно, есть ли способ напечатать только первую строку файла? Или в этом случае вторая, третья и т. Д. По выбору?»

Функция 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

Или получить каждую строку:

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 (и его рецептов !!!); это упростит ваш код.

...