Python I/O与进程的详细讲解


Posted in Python onMarch 08, 2019

I/O

with语句

with context_expression [as target(s)]:
  with-body

context_expression返回值遵从上下文管理协议,包含__enter__()__exit__()方法,as语句的target(s)得到的是__enter__()返回值,执行with-body后会调用上下文管理器的__exit__()方法,使用with语句,可以减轻某些代码编写负担,比如文件读写。

读文件

try:
  f = open('/path/to/file', 'r', encoding='utf8', errors='ignore')
  print(f.read(1024))
finally:
  if f:
    f.close()
# 使用with语句
with open('/path/to/file', 'r') as f:
  print(f.read(1024))

open()方法打开文件模式,默认以utf8格式读取,添加后缀'b'(rb、wb)表示以二进制方式读取,mode有以下几种:

Python I/O与进程的详细讲解

StringIO和BytesIO

StringIO将string按照文件的方式读取和写入,BytesIO将bytes按照文件的的方式读取和写入。

OS

通过OS模块,与操作系统信息交互,如创建、移动、列出文件等等。

序列化

通过内置模块pickle,实现序列化与反序列化,使用json模块完成JSON数据的序列化和反序列化。

import pickle
d = dict(name = 'sha', age = 26)
# 将序列化内容写入文件
with open('dump', 'wb') as f:
  pickle.dump(d, f)
# 从文件中读取序列化内容
with open('dump', 'rb') as f:
  d = pickle.load(f)
print(d) # {'name': 'sha', 'age': 26}

进程与线程

进程

Python调用一次进程fork()会有两次返回,子进程永远返回0,父进程中返回子进程ID。os.fork()不支持windows,multiprocessing模块是跨平台版本的多进程模块。

import os
pid = os.fork() # pid后的代码会在两个进程中分别执行,通过pid值不同判断父子
if pid == 0:
  print('exec in child process')
else:
  print('exec in parent process')
# exec in parent process
# exec in child process

进程池

from multiprocessing import Pool
def say(x):
  print(x)
if __name__ == '__main__':
  p = Pool(4)
  for i in range(5):
    p.apply_async(say, args=(i,))
  p.close()
  p.join()

子进程

import subprocess
print('$ nslookup amsimple.com')
r = subprocess.call(['nslookup', 'amsimple.com'])
print('Exit code:', r)

进程间通信

进程间通信通过Queue与Pipes实现,父进程创建Queue传递给子进程。

线程

Python提供两个模块_thread与threading,前者是低级模块后者是高级模块,对_thread进行了封装。

启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

import threading
# 新线程执行的代码:
def say():
  print('%s say hello' % threading.current_thread().name)
t = threading.Thread(target=say, name = 'SayThread')
t.start()
t.join()

threading.current_thread()返回但前运行线程的实例,主线程名MainTreed,子线程名在创建时指定。

通过threading.Lock()获取锁,某些需要线程安全的操作,先通过acquire()获取锁,通过release()释放锁。

Python中的线程因为GIL锁,无法真正利用多核。

通过ThreadLocal实现线程级的全局变量,不同线程间相互不影响。

import threading
th_local = threading.local() # th_local会跟线程绑定,不同线程看到的是不同对象

分布式进程

managers模块依靠网络通信,可以把多进程分布到多台机器上。

正则

通过'r'前缀定义正则字符串,通过re模块做正则匹配等操作。

import re
s = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$'
re.match(s, 'shasharoman@gmail.com')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python通过poll实现异步IO的方法
Jun 04 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
python 实现A*算法的示例代码
Aug 13 Python
django foreignkey(外键)的实现
Jul 29 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
Python线程指南分享
Nov 19 Python
Flask中endpoint的理解(小结)
Dec 11 Python
pycharm快捷键汇总
Feb 14 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
python raise的基本使用
Sep 10 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
举例讲解Python常用模块
Mar 08 #Python
python re库的正则表达式入门学习教程
Mar 08 #Python
opencv与numpy的图像基本操作
Mar 08 #Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 #Python
python实现整数的二进制循环移位
Mar 08 #Python
Python3实现的反转单链表算法示例
Mar 08 #Python
Python3实现的判断回文链表算法示例
Mar 08 #Python
You might like
php $_SERVER当前完整url的写法
2009/11/12 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
JS循环遍历JSON数据的方法
2014/07/08 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
js实现上传并压缩图片效果
2018/01/10 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
python选择排序算法实例总结
2015/07/01 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python如何在DataFrame增加数值
2020/02/14 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
会计实习生自我鉴定
2013/12/12 职场文书
中学教师教育感言
2014/02/21 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
公司授权委托书范文
2014/09/21 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
离婚起诉书范本
2015/05/18 职场文书
安全温馨提示语大全
2015/07/14 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js