【问题标题】:get_row function ignored in python在python中忽略get_row函数
【发布时间】:2013-04-18 20:36:40
【问题描述】:

我编写了一个函数来从 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

【问题讨论】:

  • 您甚至没有从异常中获得"OK"?另外,不要捕获这样的赤裸裸的异常。您正在丢失不同异常可能包含的所有有价值的信息。
  • 你要导入到另一个模块吗?
  • 如果这些打印都没有运行,这可能意味着 python 没有读取缩进错误,但你有一个。也许是 4 个空格而不是缩进。这最近发生在我身上,导致我的一个 while 循环在重新分配值之前结束,因此它永远持续下去。我只需要重新缩进那行,一切都解决了
  • 我重新缩进了所有的行,但仍然没有“OK”
  • 如果你只是从一个常规语句而不是另一个函数来做它是否有效:get_rows('companylist.csv')

标签: python function csv printing


【解决方案1】:

正如大家已经指出的那样,您正在使用生成器,这就是为什么在您第一次调用生成器的.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(','))    

【讨论】:

    【解决方案2】:

    问题在于“yield”会阻止函数作为函数运行。如果你把它改成返回,你会看到你的异常(我的 python 3 说 reader 没有 next() 函数)和你的打印。

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

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

    关于异常,看看这个:

    Handle generator exceptions in its consumer

    【讨论】:

      【解决方案3】:

      您定义了一个生成器函数get_rows,它仅在您将其作为迭代器调用时才会产生一个值。因此,除非您在 main 函数中插入 print 语句,否则您只需在 get_rows(file_name) 行中打印生成器函数(这很好,不会引发异常),它不会执行它!因此,没有执行许多print 语句。

      尝试循环遍历 get_rows(file_name) 看看会发生什么,即像这样

      for element in get_rows(file_name):
          # do something with element
      

      【讨论】:

        【解决方案4】:

        由于您的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'
        

        【讨论】:

          猜你喜欢
          • 2011-05-08
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 2021-12-04
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2019-08-05
          相关资源
          最近更新 更多