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

As your get_rows is a generator function, it executes only when one of the generator methods is called (e.g., for...in expression internally calls next() method for an iterable object). So rewriting your main function should help:

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语句,否则您只需在行中打印生成器函数(这很好,不会引发异常),它不会执行它!因此,没有执行许多语句。mainget_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”会阻止函数作为函数运行。如果你把它改成返回,你会看到你的异常(我的 python 3 说 reader 没有 next() 函数)和你的打印。

我还没有找到任何关于生成器如何抑制打印语句的文档,但是对于简单的代码似乎确实如此,例如:

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

关于异常,看看这个:

在其消费者中处理生成器异常

于 2013-04-25T05:36:44.940 回答
0

.next正如每个人已经指出的那样,您正在使用生成器,这就是为什么在您第一次调用生成器或.__next__(在 Python 3 上)之前它不会执行的原因。但是,我将建议一种get_rows使用小写列名制作函数的更好方法:

import csv

def get_rows(csv_file):
    with open(csv_file) as f:
        return csv.DictReader(f, next(f).lowercase().split(','))    
于 2013-04-25T05:48:08.693 回答