2013-01-03 37 views
0

我有這樣的功能:如何在Python中通過此列表循環訪問用戶名和密碼?

import csv 

def total(): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile) 
     a = [row for row in spamreader] 
     return a 
print total() 

的輸出是:

[['[email protected]', '1234'], ['[email protected]', 'metal'], ['[email protected]', 'hello']] 

我想遍歷每個用戶名和密碼,直到列表的末尾。目的是我想逐個傳遞用戶名和密碼。 首先,我想使用[email protected]和1234,然後進入另一個。

我試着使用:

def pass_username(): 
     with open('test.csv', 'r') as csvfile: 
      spamreader = csv.reader(csvfile, delimiter=',') 
      a = [row[0] for row in spamreader] 
      return a 

def pass_password(): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=',') 
     a = [row[1] for row in spamreader] 
     return a  

但是,這一次返回的用戶名,在一次和密碼這樣的:

[email protected] 
[email protected] 
[email protected] 
1234 
metal 
hello 

我該如何解決這個問題?由於

+0

你已經有了你需要的第一個功能。你對什麼感到困惑? – asheeshr

+0

請在我的回答中看到我的評論。 – user1881957

回答

1

更改爲一個單一的功能:

def pass_uname_passwd : 
    with open('test.csv', 'r') as csvfile: 
       spamreader = csv.reader(csvfile, delimiter=',') 
       a = [(row[0], row[1]) for row in spamreader] #Make it a list of 2d tuples 
       return a 

這將返回一個包含用戶名,密碼2D元組的列表。

list = pass_uname_passwd() 

for i in list : 
#Use as desired, processing each (uname,passwd) at a time 

你可以簡單地從你的第一個函數中做到這一點,通過之後使用for循環。我建議的唯一改變是使用元組而不是列表來使數據不可變。要做到這一點

+0

感謝您的回答。但問題是我想在不同的變量中使用用戶名和密碼(也可以這樣做)。我想要逐個處理每個用戶名和他們各自的密碼。如何做到這一點?循環播放將我帶入了我所處的最初問題。 – user1881957

+0

@ user1881957循環如何不允許您一次處理每個uname和密碼?簡單的調用/處理在循環的每次運行中你想要的。 – asheeshr

0

方式一:

def total(f): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile) 
     a = [f(row) for row in spamreader] 
     return a 
def func(username, password): 
    print username, password 
print total(func) 

或者更直接的方式:

def total(): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile) 
     for username, password in spamreader: 
      print username, password 
     return a 
print total() 
1

我覺得其他的答案覆蓋得很好。在其他的方式略有不同的利益,你也可以使用一個發電機從CSV yield行:

In [1]: import csv 

In [2]: def unames_passwd(): 
    ...:  with open('test.csv', 'r') as f: 
    ...:   reader = csv.reader(f) 
    ...:   for row in reader: 
    ...:    yield row 
    ...:    
    ...:    

In [3]: for info in unames_passwd(): 
    ...:  uname, passwd = info 
    ...:  print uname, passwd 
    ...:  
    ...:  
[email protected] 1234 
[email protected] metal 
[email protected] hello 

此外,如果你的問題是更多的「如何解析名單,我回去?」 ,你可以這樣做:也

In [8]: l = [['[email protected]', '1234'], ['[email protected]', 'metal'], ['[email protected]', 'hello']] 

In [9]: for info in l: 
    ...:  uname, passwrd = info 
    ...:  print uname, passwrd 
    ...:  
    ...:  
[email protected] 1234 
[email protected] metal 
[email protected] hello 

,按照下面的評論,你可以通過在csv_file,這將推進迭代一個步驟中使用next(),這意味着忽略標題,你for row in csv_file循環與開始第二排的CSV(注:DictReader是另一種選擇,其中每行都是返回ED作爲{column_header: value_at_row}的字典:

In [2]: def unames_passwd(): 
    ...:  with open('test.csv', 'r') as f: 
    ...:   reader = csv.reader(f) 
    ...:   next(reader) 
    ...:   for row in reader: 
    ...:    yield row 

而從上面的輸出將是相同的,減去第一行。

+0

請讀者每次函數迭代器調用一行一行地讀取文件,還是它會同時讀取整個文件? – asheeshr

+0

@AshRj它基本上就像您對文件進行正常迭代一樣(這會更有意義 - 我只是將它作爲函數,因爲我認爲這是OP想要的:))。它將以'csv.reader'相同的方式讀取文件,並返回'for'循環中的每一行。這有意義嗎,還是我進一步混淆了? :) – RocketDonkey

+0

我以爲我瞭解你的第一行。然後第二行來了.. :)簡而言之,在一次函數調用中,是從文件中讀取一行還是多行? 'csv.reader'創建了一個迭代器,但是在這種情況下,由於'yield'語句的作用,它會起作用。從邏輯上講,它應該(根據我)。我只是想驗證我是否正確思考。 – asheeshr

相關問題