python写入文件没反应_Python write 函数写文件失败
工作中涉及到了内容抓取的需求,用 Python 根据Url抓取对应的Html页面,并存储到本地文件,然后程序内继续将本地文件的路径作为参数,调用Node进行杂质过滤和内容提取。但怪的是在Python执行期间,已经完成了write操作,Node读取该文件的时候却得不到任何内容!这让我很尴尬
复现情景
伪代码如下
# filename: spider.py
# 要写入的html路径html_file_path = 'xxx.html'
# request进行抓取response = requests.get(url)
content = response.content
# 进行文件写入html_handler = open(html_file_path, "w")
html_handler.write(content) # 注意这里完成了write操作
# 调用Node进行内容过滤,Node会读取刚刚写入的 Html 文件shell = 'node filter.js --input ' + html_file_path
# 执行shell命令process = subprocess.Popen(shell)
process.communicate()
其中filter.js中是这么读取输入文件的:
filename = 'xxx.html'
var sourceContent = fs.readFileSync(filename, {
encoding: 'utf8'
});
console.log(sourceContent);
...
开始执行
python spider.py
# 但却啥内容都没有打印出
执行的时候发现xxx.html文件是已经被创建了的,但Node在读取时总是空,手动打开xxx.html也是空文件!
初步猜想
文件编码问题,Node是按照utf-8读取文件的,而文件写入的非u8
磁盘已满,文件写入失败
验证猜想
最好验证的是2,df -h 即可看到磁盘空间,然而并没有满
编码问题,恩,常见问题之一,开始追查
把程序断到write之后,打开文件查看编码,就是u8,并没有问题!
那么继续怀疑难道是Node读取的时候出错了?
写了个u8的文件让Node去读,也能正常读到!
怪了,py生成的u8,Node读取也按照u8,为啥就是失败呢?
中间有一个有意思的事情,那就是本来程序先写入xxx.html, 然后执行shell让Node去读取的,后来我提前手写了这个xxx.html文件,然后在python里注释掉了html_handler.write(content)写文件的过程,然后继续shell调用Node,竟然读取成功了!!
所以说,肯定是写文件的环节出了什么问题!在脚本运行期间,导致Python没有写入成功,所以Node读取时失败!
问题发现和解决
无意间发现,write部分的代码好像有点别扭呢,是不是少了个close()呢!!
恩 ,发现bug就是这么随意…
然后在python的write步骤之后加上了下面的代码
# 关闭文件句柄html_handler.close()
恩,世界就圆满了!一切都正常了!
问题总结
Python的write方法是AIO [Asynchronous Input/Output] 类型,即异步输入输出,类似于MySQL的落地机制,文件通过write方法写入文件时,并不是及时的写入系统磁盘,而是首先写入到自己的缓存区[内存],当缓存区满了的时候才会异步写入到磁盘进行落地,否则永远不会写入真实磁盘文件
当然,有两种情况可以改变上述异步写入的行为:
手动对文件句柄执行close()操作,这样解释器会立即刷新缓存到文件,立即写入
程序终止时如exit(),解释器会自动进行内存清理、缓存区最终落地等操作,文件也会被写入
这和PHP的垃圾回收机制也很像嘛,默认在垃圾堆【根缓存区】满了的时候自动进行变量清除,或者你手动执行gc_collect_cycles()函数释放垃圾变量,强制立即回收内存。
回顾
再回顾之所以开始我用exit方法在write处打断点时即使没close文件也是被写入的,看来是命中了情况2。
后来加了close方法是命中了情景1,所以两种情况文件都被写入了。
恩,找bug找了大半天时间,结果就是因为简单的close函数,ಥ_ಥ
如果感觉本文章有用,请帮忙点击一下页面上的广告,生活不易,多谢多谢!
python写入文件没反应_Python write 函数写文件失败相关推荐
- python读取txt文件写入失败-Python write 函数写文件失败
工作中涉及到了内容抓取的需求,用 Python 根据Url抓取对应的Html页面,并存储到本地文件,然后程序内继续将本地文件的路径作为参数,调用Node进行杂质过滤和内容提取.但怪的是在Python执 ...
- 利用fputc函数写一个putw(w,fp)函数,将整数w写入fp所指文件中; 利用fgetc函数写一函数getw(fp)从所指文件读出一整数
<程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p257 习题8 5.利用fputc函数写一个putw(w,fp)函数,将整数w写入fp所指文件中: 利 ...
- c/c++入门教程 - 2.5 文件操作、fstream(write写文件、read读文件、ios::binary二进制文件读写)
目录 2.5 文件操作 2.5.1 文本文件 2.5.1.1 写文件 2.5.1.2 读文件 2.5.2 二进制文件 2.5.2.1 二进制写文件 2.5.2.2 二进制读文件 2.5 文件操作 程序 ...
- 【学习笔记】23、读写文件(I/O操作)— 写文件
读写文件(I/O操作)- 写文件 写入文件 同读取文件一样,也是三步走: 打开/新建文件 操作文件 关闭文件 写入使用到的访问模式则是"w",开打一个文件只用于写入,如果该文件已经 ...
- python写入文件没反应_python写入文本 如何用python将变量及其值写入文本文件?...
如何用python将变量及其值写入文本文件?直到今天,你依然是小编拒绝别人的原因,其实小编也没有在等你,小编就是无法喜欢上别人而已. python中中的字典怎么写入文本文件? {('dsaa', 'd ...
- python文件操作解码_python基础3之文件操作、字符编码解码、函数介绍
内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...
- python open函数默认路径_Python open函数打开文件路径
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符,标示符'r'表示读. >>> f = open('D:/test.txt','r') 注 ...
- python except用法和作用_python上手--异常处理与文件
本专栏python属于上手系列,因为网络资源众多,有从零基础开始介绍的,也有各种进阶应用,我在这个专栏里就从上手来介绍python,零基础也许不一定合适.但实践永远是获得认知的手段,因此上手实践操作对 ...
- python输出字体的大小_Python密码学编程:文件的加密与解密
在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...
- python读取文件特定内容_Python基础知识之文件的读取操作
读取文件的操作步骤 有一道脑筋急转弯,问把大象装进冰箱的步骤,答案很简单,打开冰箱.把大象推进去.关闭冰箱.这就是一个处理问题的思路,我们对文件的操作和这个一样,第一步:打开文件:第二部:处理文件(读 ...
最新文章
- Win10 15063 开始运行不保存历史记录原因和解决方法
- 大数据产品不仅仅是IT工具
- fatal: Unsupported SSL backend ‘“openssl”‘. Supported SSL backends:
- 中国无碳复写纸行业竞争现状与运行态势研究报告2022年
- 数据结构与算法之RandomPool结构和岛问题
- android控件在同一水平,android – 在linearlayout中水平对齐按钮,间距相等
- android模拟点击滑动,模拟Android的view点击和滑动监听
- 第一讲(3)osgearth编译
- matlab生成16进制正弦波表
- vscode中怎样格式化js代码_vscode格式化配置
- 基于荔枝派Lichee Nano(全志f1c100s)的u-boot移植(一)
- UML图箭头和实线虚线到底什么意思
- 把Wordpress集成到zen-cart里方法 各种修改 经典机制
- photoshop中魔棒使用方法
- 区块链十年一梦:有人辞官归故里,有人星夜来赶考
- 制作动态图表,没有比这个方法更简单的了
- 软件测试|Vuetify框架的使用
- html5小游戏 typescript,使用TypeScript和Canvas编写移动端贪吃蛇大作战游戏
- js获取keyCode
- Oracle项目管理系统之合同索赔反索赔
热门文章
- cryengine3 C++添加结点,制作插件
- cordova通过指纹插件进行指纹验证
- 新号起步狂揽近200万粉,“老年”账号也能成为推广黑马
- PDF Expert for mac(pdf编辑工具)
- 小游戏轻量级数据库-GameDb
- 关于IMDB,-------Internet Movie Database(互联网电影数据库)
- mysql_存储过程游标、循环
- ubuntu mysql 默认安装路径_ubuntu安装mysql并修改默认目录
- 获取基因的所有转录本(不同亚型)的外显子区域
- 编写一个程序,输入月份号,输出该月份号的英文名称