文档章节

Python使用with时本猿犯了一个错误

思想永无止境
 思想永无止境
发布于 2016/11/04 11:57
字数 319
阅读 3
收藏 0

以下这段代码导致压缩包内的图片不完整,重新解压后发现文件大小比原文件小一点点。
但是导致图片无法打开,我也是由图片打不开这个bug一步一步找到是没关流的原因。
这个问题很严重,找了半天才知道是文件流没有关闭导致。

for d in tableData:
    imageFile = urllib2.urlopen(d["image"])
    img_name=str(partId)+"_"+str(d["id"])+getFilePostfix(d["image"])
    img_path=rootDir+img_name
    with open(img_path, "wb") as f
        f.write(imageFile.read())
        zf.write(img_path, img_name)
zf.close()

上面这样写是没有关闭流的,因为代码zf.write(img_path, img_name) 还在with语句块里!!!!
而只有with语句结束,流才会关闭,这其实和java7的try是一样的。

//不需要关流,定义在try的流对象java会自己关
try (FileOutputStream fis=new FileOutputStream(new File("/home/zc/test.py"));FileInputStream fos=new FileInputStream(new File("/home/zc/test.py"))){
    fis.write("mytest".getBytes());
    fos.read();//这句代码写在这里不一定能读取到“mytest”内容,因为此时fis还没关闭也没有flush刷出。
} catch (Exception e) {
    e.printStackTrace();
}

正确的写法:

for d in tableData:
    imageFile = urllib2.urlopen(d["image"])
    img_name=str(partId)+"_"+str(d["id"])+getFilePostfix(d["image"])
    img_path=rootDir+img_name
    with open(img_path, "wb") as f
        f.write(imageFile.read())
    zf.write(img_path, img_name)
zf.close()

这样写就一点问题都没有。

© 著作权归作者所有

思想永无止境
粉丝 4
博文 257
码字总数 292814
作品 0
昌平
程序员
私信 提问
Python程序员的30个常见错误

在这篇文章中,我将总结新老Python程序员常犯的一些错误,以帮助你们在自己的工作避免犯同样或类似错误。 首先我要说明一下的是,这些都是来源于第一手的经验。我以讲授Python的知识为生。在...

Mr_zebra
2018/12/04
0
0
十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

1、滥用表达式作为函数参数默认值 Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参数可变时,很容易导致混乱,例如,下面这段函数定义: 在上面这段代码里,一...

Python新世界
2018/08/06
0
0
自动化测试平台 Robot Framework 快速入门

目录 Robot Framework 快速入门 介绍 概述 安装 运行demo. 介绍样例应用程序 测试用例 介绍 概述 Robot Framework 是一个关键词驱动的自动测试框架。测试用例位于HTML或者TSV(以tab分隔值)文...

红薯
2010/11/09
3.4K
1
译 | 我是如何爱上Go语言的

我和编译型编程语言 : 火花不再 在攻读博士学位的时间里,我对用python、R语言和unix shell脚本解决问题和编写代码感到得心应手。为了提高自己的技能,我想,学习用较低级的编译型编程语言进...

程序师
2018/07/15
0
0
Visual Studio 2017 15.6 版本预览,增加新功能

Visual Studio 2017 15.6 版本预览,这个最新的预览包含新功能,生产力改进和其他增强功能,以解决客户的反馈意见。 本发行版中的更新摘要 Python不再需要完成数据库,Anaconda用户现在可以支...

周其
2017/12/09
3K
12

没有更多内容

加载失败,请刷新页面

加载更多

老也有错?35岁程序员是一道坎,横亘在每个技术职场人的心中

随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后,都会开始思考5年、10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛...

我最喜欢三大框架
27分钟前
1
0
今日头条算法原理详解全集,值得收藏!

今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从 2012 年 9月第一版开发运行至今,已经经...

骚年锦时
39分钟前
4
0
零拷贝:用户态视角

在Linux系统越来越多的人听说过所谓的零拷贝技术,但是我经常遇到很多对这个名词没有完全理解的人。因此,我决定写一些文章,深挖这个问题,希望能揭开这个有用的特性。在这篇文章,我们从用...

凌渡
51分钟前
0
0
以太坊中文文档翻译-区块

本文原文链接 点击这里获取Etherscan API 中文文档(完整版) 完整内容排版更好,推荐读者前往阅读。 区块(Blocks) 区块相关的 API,接口的参数说明请参考Etherscan API 约定, 文档中不单独...

Tiny熊
59分钟前
2
0
Linux 内核的一个问题

是virtio 驱动,但是没有启动 virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.....[ 1.047924] md: ... autorun......

MtrS
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部