所以我现在有了这段代码来读取一个看起来像这样的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
(这些是我在文本文件中的三行,正确分割,但它打印所有行,只打印每行的第一个字母。)
我尝试过几种不同的方法但没有运气。任何人都知道该怎么做?
感谢您的帮助。非常感谢。这是我的第二天编程,我为这么简单的问题道歉。
答案 0 :(得分:7)
username
和password
是字符串。当您对字符串执行此操作时,您将获得字符串中的第一个字符:
username[0]
不要那样做。只需print username
。
进一步解释。 credentials
是字符串列表的列表。打印出来时看起来像这样:
[['username1', 'password1'], ['username2', 'password2'], ['username3', 'password3']]
要获得一个用户名/密码对,您可以执行以下操作: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
。
答案 1 :(得分:2)
首先,我想说如果这是你的第二天编程,那么你已经开始使用with
语句和list comprehensions了一个良好的开端!
正如其他人已经指出的那样,由于您使用包含[]
变量的变量进行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
函数非常有用,例如,仅用于获取第二个&第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