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使用reportlab实现图片转换成pdf的方法
May 22 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
Python之时间和日期使用小结
Feb 14 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
Python中的__init__作用是什么
Jun 09 Python
python playwright 自动等待和断言详解
Nov 27 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版)
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
javascript实现简易计算器
2017/02/01 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
python实现DEM数据的阴影生成的方法
2019/07/23 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
青年安全生产示范岗事迹材料
2014/05/04 职场文书
环境建议书
2015/02/04 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS