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 制作糗事百科爬虫实例
Sep 22 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Python函数和模块的使用总结
May 20 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
python 利用opencv实现图像网络传输
Nov 12 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
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
Seajs的学习笔记
2014/03/04 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
react基本安装与测试示例
2020/04/27 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
python if not in 多条件判断代码
2016/09/21 Python
Python yield 使用方法浅析
2017/05/20 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python交互式图形编程实例(二)
2017/11/17 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
python进行文件对比的方法
2018/12/24 Python
如何清空python的变量
2020/07/05 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
linux面试题参考答案(4)
2013/01/28 面试题
管理科学大学生求职信
2013/11/13 职场文书
探亲邀请信范文
2014/01/30 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python