2012-01-31 77 views
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 

(這些都是三線我在文本文件中,正確拆分,但是它打印所有行,並且只打印每行的第一個字母。)

我嘗試了幾種不同的方法,但沒有運氣。任何人都有想法該怎麼做?

謝謝你的一切幫助。真的很感激。這是我的第二天編程,我對這樣一個簡單的問題表示歉意。

回答

7

usernamepassword是字符串。當您對字符串執行此操作時,會得到字符串中的第一個字符:

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

+0

嘿,謝謝你。我剛剛回答了與你的答案類似的Johnsyweb。 :)很好奇,如果有一種方法只打印文件的第一行?或者在這種情況下,選擇第二,第三等?再次感謝! – Shtoops 2012-01-31 02:47:33

+0

這完全是我需要的,它完美的工作!非常感謝你,夥計。我無法表達你的幫助和Johnsyweb的幫助。 :) – Shtoops 2012-01-31 02:56:09

+3

@Shtoops:歡迎來到StackOverflow! 「非常感謝你,男人」最好表達爲[「通過點擊答案左側的複選框大綱」](http://stackoverflow.com/faq#howtoask)。 – Johnsyweb 2012-01-31 03:04:32

2

首先,我想說如果這是您的第二天編程,那麼您已經開始使用with聲明和list comprehensions了!

正如其他人已經指出的那樣,因爲你正在使用[]索引與包含str ING一個變量,它將該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)你還提到你是「好奇,如果有隻打印文件的第一行的方式或者在這種情況下,第二次? ,第三,等等?「

itertools包中的islice(iterable[, start], stop[, step])功能的偉大工程,例如,得到的只是第二& 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 !!!);它會簡化你的代碼。

+0

剛纔看到了這個。非常感謝你提供這樣一個精心設計的答案!我一定會研究itertools。 :) – Shtoops 2012-02-03 02:32:43