在python中忽略get_row函数
我编写了一个函数从csv文件中获取行数据,但失败了。因此,我插入了这么多“打印”以查看错误。但令我惊讶的是,控制台一直是空的,这很奇怪。我已经多次修改代码 我的代码被破坏了:在python中忽略get_row函数,python,function,csv,printing,Python,Function,Csv,Printing,我编写了一个函数从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
# -*- 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
# -*- 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()
工作非常完美,结果是:
('symbol', 'name', 'lastsale', 'marketcap', 'adr tso', 'ipoyear', 'sector', 'industry', 'summary quote', '')
而代码:
# -*- 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
# -*- 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
由于您的get\u行
是一个,它仅在调用其中一个生成器方法时执行(例如,for…in
表达式内部调用了一个iterable对象的next()
方法)。因此,重写main
函数应有助于:
def main():
file_name='companylist.csv'
try:
for row in get_rows(file_name):
print row
except:
print 'OK'
您定义了一个生成器函数
get_rows
,该函数仅在您将其作为迭代器调用时生成一个值。因此,除非在main
函数中插入print
语句,否则只需在get\u rows(file\u name)
行中打印生成器函数(这很好,不会引发异常),而该行不会执行它!因此,许多print
语句都不会执行
尝试在get\u行(文件名)
上循环,看看会发生什么,例如这样
for element in get_rows(file_name):
# do something with element
问题是“屈服”会阻止函数作为函数运行。如果您将其更改为return,您将看到您的异常(我的Python3说reader没有next()函数)和打印 我还没有找到任何关于生成器如何抑制打印语句的文档,但对于以下简单代码似乎确实如此:
def mygen():
print('1')
yield 1
关于例外情况,请看以下内容:
正如大家已经指出的,您使用的是生成器,这就是为什么在您第一次调用生成器的
.next
或.next\uuuuuuuuu
之前,它不会执行。但是,我将建议一种更好的方法,使您的get_rows
函数使用小写列名:
import csv
def get_rows(csv_file):
with open(csv_file) as f:
return csv.DictReader(f, next(f).lowercase().split(','))
您甚至没有从异常中获得
“OK”
?另外,不要捕捉这样赤裸裸的异常。您正在丢失不同异常可能包含的所有有价值的信息。是否将其导入到另一个模块?如果这些打印都没有运行,可能意味着python没有读取缩进错误,但您有一个缩进错误。可能是4个空格而不是缩进。这最近发生在我身上,导致我的一个while循环在重新分配值之前结束,所以它一直持续下去。我只需要重新缩进那一行,所有的事情都解决了。我重新缩进了所有的行,但仍然没有得到“OK”,如果你只是从一个常规语句而不是另一个函数中执行它,它是否有效:get\u rows('companylist.csv')