2013-01-03 38 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

相关问题