0

csv ファイルから行データを取得する関数を作成しましたが、失敗しました。そのため、何が問題なのかを確認するために非常に多くの「印刷」を挿入しましたが、驚いたことに、コンソールは空のままで、奇妙なことです。私のコードが何度も吹き飛ばされたコード:

# -*- coding: utf-8 -*-
import csv

def get_rows(csv_file):
    print '0'
    reader=csv.reader(open(csv_file))
    print '1'
    #get the colnum names,lowercased
    col_names=tuple(k.lower() for k in reader.next())
    print '2' 
    for row in reader:
        yield dict(zip(col_names,row))
    print col_names

def main():
    file_name='companylist.csv'

    try:
        get_rows(file_name)
    except:
        print 'OK'
if __name__=='__main__':
    main()

コード中:

# -*- coding: utf-8 -*-
import csv

reader=csv.reader(open('companylist.csv'))
col_names=tuple(k.lower() for k in reader.next())
for row in reader:
    dict(zip(col_names,row))
print col_names

完全に動作し、次のようになります。

('symbol', 'name', 'lastsale', 'marketcap', 'adr tso', 'ipoyear', 'sector', 'industry', 'summary quote', '')

コード中:

# -*- coding: utf-8 -*-
import csv

def main():
    reader=csv.reader(open('companylist.csv'))
    col_names=tuple(k.lower() for k in reader.next())
    print '1'
    print col_names
    for row in reader:
        yield dict(zip(col_names,row))
    print col_names

if __name__=='__main__':
    main()

何の結果にもならなかった

そしてコード:

# -*- coding: utf-8 -*-
import csv
def get_rows(csv_file):
    print '0'
    reader=csv.reader(open(csv_file))
    print '1'
    #get the colnum names,lowercased
    col_names=tuple(k.lower() for k in reader.next())
    print '2' 
    for row in reader:
        yield dict(zip(col_names,row))
    print col_names
def main():
    file_name='companylist.csv'

    try:
        if(get_rows(file_name)):
            print "OK"
    except Exception,ex:
        print Exception,":",ex
if __name__=='__main__':
    main()

をもたらしました :OK

4

4 に答える 4

2

yourget_rowsジェネレーター関数であるため、ジェネレーター メソッドの 1 つが呼び出された場合にのみ実行されます (たとえば、式は反復可能なオブジェクトのメソッドをfor...in内部的に呼び出します)。したがって、関数をnext()書き直すと役立つはずです。main

def main():
    file_name='companylist.csv'

    try:
        for row in get_rows(file_name):
            print row
    except:
        print 'OK'
于 2013-04-25T05:31:51.757 に答える
0

ジェネレーター関数get_rowsを定義します。これは、イテレーターとして呼び出したときにのみ値を生成します。printしたがって、関数にステートメントを挿入しない限りmain、ジェネレーター関数を行に出力するだけでget_rows(file_name)(これは問題なく、例外は発生しません)、それは実行されません! したがって、多くのprintステートメントはどれも実行されません。

ループしてみてget_rows(file_name)、何が起こるか見てみましょう。

for element in get_rows(file_name):
    # do something with element
于 2013-04-25T05:33:58.687 に答える
0

問題は、「yield」によって関数が関数として動作しなくなることです。return に変更すると、例外が表示されます (私の python 3 では、リーダーには next() 関数がないと言われています)。

ジェネレーターが print ステートメントを抑制する方法に関するドキュメントは (まだ) 見つけていませんが、次のような単純なコードの場合はそうであるようです。

def mygen():
    print('1')
    yield 1

例外に関しては、これを見てください:

コンシューマーでジェネレーターの例外を処理する

于 2013-04-25T05:36:44.940 に答える