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

(这些是我在文本文件中的三行,正确拆分,但是它打印所有行,并且只打印每行的第一个字母。)

我尝试了几种不同的方法,但都没有运气。有人知道该怎么做吗?

谢谢你的帮助。真的很感激。这是我第二天的编程,对于这么简单的问题,我深表歉意。

4

2 回答 2

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.

于 2012-01-31T02:39:30.970 回答
2

首先,我想说如果这是您的第二天编程,那么您已经通过使用with语句和列表推导有了一个良好的开端!

正如其他人已经指出的那样,由于您正在[]对包含string 的变量使用索引,因此它将 视为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(及其食谱!!!);它将简化您的代码。

于 2012-01-31T04:03:09.843 回答