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 多线程应用介绍
Dec 19 Python
分享15个最受欢迎的Python开源框架
Jul 13 Python
django+js+ajax实现刷新页面的方法
May 22 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
Python打印输出数组中全部元素
Mar 13 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
新手入门Python编程的8个实用建议
Jul 12 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
python中的测试框架
Nov 13 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根据IP地址获取所在城市具体实现
2013/11/27 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Python猴子补丁知识点总结
2020/01/05 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
办公室副主任职责范本
2014/03/08 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2014年节能工作总结
2014/12/18 职场文书
2015年中个人总结范文
2015/03/10 职场文书
教师远程培训心得体会
2016/01/09 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS