无法从文本文件中打印特定行

时间:2012-01-31 02:37:19

标签: python python-3.x mechanize mechanize-python

所以我现在有了这段代码来读取一个看起来像这样的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

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

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

感谢您的帮助。非常感谢。这是我的第二天编程,我为这么简单的问题道歉。

2 个答案:

答案 0 :(得分:7)

usernamepassword是字符串。当您对字符串执行此操作时,您将获得字符串中的第一个字符:

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

花时间学习itertools(及其recipes !!!);它会简化你的代码。