0

私はこのような機能を持っています:

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()

の出力は次のとおりです。

[['admin@gmail.com', '1234'], ['ok@gmail.com', 'metal'], ['hithere@gmail.com', 'hello']]

リストの最後まで各ユーザー名とパスワードをループしたい。目的は、ユーザー名とパスワードを1つずつ渡したいです。最初に admin@gmail.com と 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     

しかし、これは次のようにユーザー名とパスワードを一度に返します。

admin@gmail.com
ok@gmail.com
hihere@gmail.com
1234
metal
hello

どうすればこれを修正できますか? ありがとう

4

3 に答える 3

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

これは、ユーザー名、パスワードを含む 2 次元タプルのリストを返します。

list = pass_uname_passwd()

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

後で for ループを使用することにより、最初の関数からも簡単にこれを行うことができます。私が提案する唯一の変更は、リストの代わりにタプルを使用して、データを不変にすることです。

于 2013-01-03T04:37:20.183 に答える
1

他の回答はそれをうまくカバーしていると思います。他のわずかに異なる方法のために、ジェネレーターを使用しyieldて CSV の行を取得することもできます。

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
   ...:     
   ...:     
admin@gmail.com 1234
ok@gmail.com metal
hithere@gmail.com hello

また、質問が「返されたリストを解析するにはどうすればよいですか?」という質問の場合は、次のようにすることができます。

In [8]: l = [['admin@gmail.com', '1234'], ['ok@gmail.com', 'metal'], ['hithere@gmail.com', 'hello']]

In [9]: for info in l:
   ...:     uname, passwrd = info
   ...:     print uname, passwrd
   ...:     
   ...:     
admin@gmail.com 1234
ok@gmail.com metal
hithere@gmail.com hello

また、以下のコメントに従って、next()on を使用してヘッダーを無視できますcsv_file。これにより、反復が 1 ステップ進みます。これはfor row in csv_file、CSV の 2 行目で開始するループを意味します (注:DictReaderここでは、各行が返される別のオプションです)。の辞書として{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

そして、上記の出力は同じで、最初の行を除いたものになります。

于 2013-01-03T04:47:46.603 に答える
0

これを行う1つの方法:

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()
于 2013-01-03T04:44:05.343 に答える