python中txt文件的读写,python读取txt某一行数据
这项工作涉及内容捕获的需求。使用Python根据Url抓取相应的Html页面,并存储在本地文件中。然后在程序中把本地文件的路径作为参数,调用Node过滤杂质,提取内容。但奇怪的是,Python执行过程中,写操作已经完成,而Node读取文件时,却什么都得不到!这让我很尴尬。
重现场景
伪代码如下
#文件名:spider.py
# html路径写html_file_path=xxx.html
#请求抓取响应=requests.get(url)
内容=响应.内容
# Write file HTML _ handler=open(HTML _ file _ path, W )
Html_handler.write(content) #注意,写操作在这里完成
#调用Node进行内容过滤,Node会读取刚刚写好的Html文件shell= Node filter . js-input Html _ file _ path。
#执行shell命令流程=子流程。波普(贝壳)
process.communicate()
下面是如何在filter.js中读取输入文件:
filename=xxx.html
var source content=fs . read file sync(文件名,{
编码:“utf8”
});
console . log(source content);
.
开始执行。
python spider.py
#但是什么都没有打印出来。
执行时发现xxx.html文件已经创建,但读取时Node始终为空,手动打开xxx.html也是空文件!
初步推测
文件编码问题,节点按照utf-8读取文件,但是文件不是用u8写的。
磁盘已满,文件写入失败。
验证猜想
最好验证的是2,df -h可以看到磁盘空间,但是没有满。
编码问题,嗯,常问的问题之一,开始追溯。
破了程序写完,打开文件查看代码,是u8,没有问题!
然后继续怀疑是不是Node读的时候出错了?
写一个u8文件供Node读取,可以正常读取!
奇怪,py生成u8,Node按照u8读取。为什么是失败?
中间有个有趣的事情,就是先把原程序写入xxx.html,然后执行shell让Node读取。后来我提前手写了这个xxx.html文件,然后用python注释掉了用html_handler.write(content)写文件的过程,然后继续用shell调用Node,读取成功了!
所以,文档写作流程一定有问题!脚本运行过程中,Python写操作失败,节点读操作失败!
发现和解决问题
不经意间,我发现write部分的代码好像有点别扭。是不是少了一个句号()。
嗯,找bug太随机了…
然后在python的write步骤之后添加以下代码
#关闭文件句柄html_handler.close()
嗯,世界就完整了!一切正常!
问题总结
Python的写方法是AIO[异步输入/输出]类型,即异步输入/输出,类似于MySQL的登陆机制。当一个文件用write方法写到系统盘时,首先写到自己的cache [memory]中,然后在cache满了的时候异步写到磁盘上进行登陆,否则永远不会写到真正的磁盘文件中。
当然,有两种情况会改变上述异步写入的行为:
手动在文件句柄上执行close()操作,这样解释器会立即将缓存刷新到文件并立即写入。
当程序终止时,比如exit(),解释器会自动清理内存,最后降落缓冲区,文件就被写入了。
这也非常类似于PHP的垃圾收集机制。默认情况下,当垃圾转储[根缓存]已满时,变量将被自动清除,或者您可以手动执行gc_collect_cycles()函数来释放垃圾变量,并强制立即收集内存。
回顾
回过头来看,我之所以在write时开始使用exit方法来中断这个点,是因为即使没有关闭文件,似乎也命中了case 2。
后来,close方法被添加到hit场景1中,因此两种情况下的文件都被写入。
嗯,我大部分时间都在找bug,结果就是因为简单的关闭函数,_
如果你觉得这篇文章有用,请点击页面上的广告。生活不易,非常感谢!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。