工作中涉及到了内容抓取的需求,用 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 函数写文件失败相关推荐

  1. python读取txt文件写入失败-Python write 函数写文件失败

    工作中涉及到了内容抓取的需求,用 Python 根据Url抓取对应的Html页面,并存储到本地文件,然后程序内继续将本地文件的路径作为参数,调用Node进行杂质过滤和内容提取.但怪的是在Python执 ...

  2. 利用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所指文件中: 利 ...

  3. 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 文件操作 程序 ...

  4. 【学习笔记】23、读写文件(I/O操作)— 写文件

    读写文件(I/O操作)- 写文件 写入文件 同读取文件一样,也是三步走: 打开/新建文件 操作文件 关闭文件 写入使用到的访问模式则是"w",开打一个文件只用于写入,如果该文件已经 ...

  5. python写入文件没反应_python写入文本 如何用python将变量及其值写入文本文件?...

    如何用python将变量及其值写入文本文件?直到今天,你依然是小编拒绝别人的原因,其实小编也没有在等你,小编就是无法喜欢上别人而已. python中中的字典怎么写入文本文件? {('dsaa', 'd ...

  6. python文件操作解码_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  7. python open函数默认路径_Python open函数打开文件路径

    要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符,标示符'r'表示读. >>> f = open('D:/test.txt','r') 注 ...

  8. python except用法和作用_python上手--异常处理与文件

    本专栏python属于上手系列,因为网络资源众多,有从零基础开始介绍的,也有各种进阶应用,我在这个专栏里就从上手来介绍python,零基础也许不一定合适.但实践永远是获得认知的手段,因此上手实践操作对 ...

  9. python输出字体的大小_Python密码学编程:文件的加密与解密

    在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的.但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符. 本章要点 open()方法. ...

  10. python读取文件特定内容_Python基础知识之文件的读取操作

    读取文件的操作步骤 有一道脑筋急转弯,问把大象装进冰箱的步骤,答案很简单,打开冰箱.把大象推进去.关闭冰箱.这就是一个处理问题的思路,我们对文件的操作和这个一样,第一步:打开文件:第二部:处理文件(读 ...

最新文章

  1. Win10 15063 开始运行不保存历史记录原因和解决方法
  2. 大数据产品不仅仅是IT工具
  3. fatal: Unsupported SSL backend ‘“openssl”‘. Supported SSL backends:
  4. 中国无碳复写纸行业竞争现状与运行态势研究报告2022年
  5. 数据结构与算法之RandomPool结构和岛问题
  6. android控件在同一水平,android – 在linearlayout中水平对齐按钮,间距相等
  7. android模拟点击滑动,模拟Android的view点击和滑动监听
  8. 第一讲(3)osgearth编译
  9. matlab生成16进制正弦波表
  10. vscode中怎样格式化js代码_vscode格式化配置
  11. 基于荔枝派Lichee Nano(全志f1c100s)的u-boot移植(一)
  12. UML图箭头和实线虚线到底什么意思
  13. 把Wordpress集成到zen-cart里方法 各种修改 经典机制
  14. photoshop中魔棒使用方法
  15. 区块链十年一梦:有人辞官归故里,有人星夜来赶考
  16. 制作动态图表,没有比这个方法更简单的了
  17. 软件测试|Vuetify框架的使用
  18. html5小游戏 typescript,使用TypeScript和Canvas编写移动端贪吃蛇大作战游戏
  19. js获取keyCode
  20. Oracle项目管理系统之合同索赔反索赔

热门文章

  1. cryengine3 C++添加结点,制作插件
  2. cordova通过指纹插件进行指纹验证
  3. 新号起步狂揽近200万粉,“老年”账号也能成为推广黑马
  4. PDF Expert for mac(pdf编辑工具)
  5. 小游戏轻量级数据库-GameDb
  6. 关于IMDB,-------Internet Movie Database(互联网电影数据库)
  7. mysql_存储过程游标、循环
  8. ubuntu mysql 默认安装路径_ubuntu安装mysql并修改默认目录
  9. 获取基因的所有转录本(不同亚型)的外显子区域
  10. 编写一个程序,输入月份号,输出该月份号的英文名称