我写了一个函数来从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
答案 0 :(得分:2)
由于get_rows
是generator 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
关于例外情况,请看一下:
答案 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(','))