Python 新人求助,一模一样的代码在不同文件中运行结果却不同

2022-05-23 21:49:31 +08:00
 wapptm
import csv
with open('update.csv',mode='r',encoding='utf-8') as f:
f_csv=csv.reader(f)
header=next(f_csv)
for row in f_csv:
print ( row )


上面这段代码是主程序中的一段,执行到 header=next(f_csv) 时就抛出 StopIteration 的错误

但是如果我把这段代码单独写在一个新的文件中,整个文件只有下面这一段代码,却又能正常运行,不再抛出错误,这个是什么原因?

import csv

with open('update.csv',mode='r',encoding='utf-8') as f:
f_csv=csv.reader(f)
header=next(f_csv)
for row in f_csv:
print(row)
2573 次点击
所在节点    Python
9 条回复
ila
2022-05-23 21:51:59 +08:00
把文件路径写完整后试试
wapptm
2022-05-23 22:08:01 +08:00
试过了,写上完整的路径还是一样报错
yoghurtoreo
2022-05-23 22:11:18 +08:00
StopIteration 一般是容器空了,盲猜你 f.read 之类的了👻
llh880808
2022-05-23 22:26:42 +08:00
之前已经读过 f_csv 了,在执行 next(f_csv)之前,f_csv 已经被遍历到最后一个元素,再 next 试图获取下一个就会报错

类似下面这样(记得空格会被吞,用.代替空格):

with open('demo.csv') as fr:
....for row in fr:
........print(row)
....next(fr)

这段示例也会抛出 StopIteration
wapptm
2022-05-23 22:33:44 +08:00
那么为什么我把同样的一段代码单独写在一个新的文件中,就不会报错呢?

import csv

with open('update.csv',mode='r',encoding='utf-8') as f:
f_csv=csv.reader(f)
print(f_csv)
header=next(f_csv)
for i in f_csv:
print(i)
wapptm
2022-05-23 22:39:16 +08:00
这两段代码是一样的,运行结果却不一样,唯一能解释的就是运行出错的这个文件中的相关代码导致了此类问题

在这段代码之前有这么一段代码,我想应该是导致出现此类问题的原因所在:
f=open('update.csv',mode='a',encoding='utf-8',newline='')
csv_writer=csv.DictWriter(f,fieldnames=['title','version','href'])
csv_writer.writeheader()#写入表头

items=driver.find_elements(By.CSS_SELECTOR,'.structItem-cell:nth-child(2)')
for item in items:
#获取子网页链接地址
href=item.find_element(By.CSS_SELECTOR,'.structItem-title a').get_attribute('href')
#获取子网页标题
title=item.find_element(By.CSS_SELECTOR,'.structItem-title a').text
try:
#获取子网页版本号,如果无版本号就返回空值
item.find_element(By.CSS_SELECTOR,'.structItem-title span')
version=item.find_element(By.CSS_SELECTOR,'.structItem-title span').text
except:
version='null'
dict={
'title':title,
'version': version,
'href': href,
}
print(dict)
csv_writer.writerow(dict)


with open('update.csv',mode='r',encoding='utf-8') as f:
f_csv=csv.reader(f)
print(f_csv)
header=next(f_csv)
for i in f_csv:
print(i)
arischow
2022-05-23 22:45:18 +08:00
如果你只是想跳过 header ,不应该用 next 。

再简单点说,不要用 next ,用别的方法写就可以绕过了。

如果你一定要用的话,请看文档: https://docs.python.org/3/library/functions.html#next
wapptm
2022-05-23 22:47:31 +08:00
多谢 4 楼的解释
我找到问题所在了,之前 CSV 文件写入完成后,没有关闭,导致在后面执行 next ()函数时,实际上已经执行到最后一条记录了
在 循环体后加了个 f.close()就解决这个问题了
tony9413
2022-05-23 23:11:49 +08:00
不建议这样写,容易出问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX