python中忽略了get_row函数

时间:2013-04-25 04:36:07

标签: python function csv printing

我写了一个函数来从csv文件中获取行数据,这个函数失败了。所以我插入了很多“print”来看看有什么问题。但令我惊讶的是,控制台只是保持空白,这就是退出奇怪。我已经多次重复我的代码了 我的代码很糟糕:

# -*- 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 个答案:

答案 0 :(得分:2)

由于get_rowsgenerator function,它仅在调用其中一个生成器方法时执行(例如,for...in表达式内部调用next()方法作为可迭代对象)。因此,重写main函数应该会有所帮助:

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

    try:
        for row in get_rows(file_name):
            print row
    except:
        print 'OK'

答案 1 :(得分: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

答案 2 :(得分:0)

问题是'yield'会使函数停止表现为函数。如果你改变它返回,你会看到你的异常(我的python 3说读者没有next()函数)和你的打印。

我还没有找到关于生成器如何抑制print语句的任何文档,但是这似乎是简单代码的情况,例如:

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

关于例外情况,请看一下:

Handle generator exceptions in its consumer

答案 3 :(得分: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(','))