Во-первых, я хотел бы сказать, если это ваш второй день программирования, то вы хорошо начали, используя оператор 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 (и его рецептов !!!); это упростит ваш код.