Python -- I/O编程
文章目录
- 一、文件读写
- 1. 读文件
- 2. 二进制文件
- 3. 字符编码
- 4. 写文件
- 二、StringIO和BytesIO
- 三、操作文件和目录
- 1. 操作系统命令
- 2. 操作文件
- 四、序列化
- 五、 JSON
- 六、异步IO
- 1. 协程
- 2. asyncio
- async/await
- aiohttp
一、文件读写
Python内置了读写文件的函数,用法和C是兼容的。
1. 读文件
- 使用Python内置的open()函数,传入文件名和标示符:
>>> f = open('/Users/michael/test.txt', 'r')
标示符’r’表示读,这样,我们就成功地打开了一个文件。如果文件不存在,open()
函数就会抛出一个IOError的错误.
- 调用read()方法可以一次读取文件的全部内容
>>> f.read()
'Hello, world!'
- 调用close()方法关闭文件
>>> f.close()
- Python引入了with语句来自动帮我们调用close()方法
with open('/path/to/file', 'r') as f:print(f.read())
调用
read()
会一次性读取文件的全部内容
调用read(size)
方法,每次最多读取size个字节的内容
调用readline()
可以每次读取一行内容
调用readlines()
一次读取所有内容并按行返回list
2. 二进制文件
要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
3. 字符编码
读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
遇到编码错误忽略
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
4. 写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件
with open('/Users/michael/test.txt', 'w') as f:f.write('Hello, world!')f.close()
二、StringIO和BytesIO
- StringIO 在内存中读写str
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
- BytesIO 操作二进制数据
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
三、操作文件和目录
1. 操作系统命令
>>> import os
>>> os.name # 操作系统类型
'posix'
如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
在操作系统中定义的环境变量,全部保存在os.environ
这个变量中
2. 操作文件
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')
把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()
函数
part-1/part-2
要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()
函数
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
四、序列化
Python提供了pickle模块来实现序列化。
- 序列化
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
pickle.dump()
直接把对象序列化后写入一个file-like Object
:
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
- 反序列化
要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
五、 JSON
- JSON和Python内置的数据类型对应
JSON类型 | Python类型 |
---|---|
{} | dict |
[] | list |
“string” | str |
1234.56 | int或float |
true/false | True/False |
null | None |
- Python对象到JSON格式的转换
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
- JSON反序列化为Python对象
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}
- 类序列化
需要为Student专门写一个转换函数,再把函数传进去
def student2dict(std):return {'name': std.name,'age': std.age,'score': std.score}import jsonclass Student(object):def __init__(self, name, age, score):self.name = nameself.age = ageself.score = scores = Student('Bob', 20, 88)
print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88}
六、异步IO
1. 协程
协程,又称微线程,纤程。英文名Coroutine。协程的特点在于是一个线程执行
多线程比协程有何优势?
- 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
- 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
Python对协程的支持是通过generator实现的。
协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高:
def consumer():r = ''while True:n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)r = '200 OK'def produce(c):c.send(None)n = 0while n < 5:n = n + 1print('[PRODUCER] Producing %s...' % n)r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)c.close()c = consumer()
produce(c)
结果
[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK
注意到consumer函数是一个generator,把一个consumer传入produce后:
- 首先调用c.send(None)启动生成器;
- 然后,一旦生产了东西,通过c.send(n)切换到consumer执行;
- consumer通过yield拿到消息,处理,又通过yield把结果传回;
- produce拿到consumer处理的结果,继续生产下一条消息;
- produce决定不生产了,通过c.close()关闭consumer,整个过程结束。
整个流程无锁,由一个线程执行,produce和consumer协作完成任务,所以称为“协程”,而非线程的抢占式多任务。
2. asyncio
用asyncio的异步网络连接来获取sina、sohu和163的网站首页:
import asyncio@asyncio.coroutine
def wget(host):print('wget %s...' % host)connect = asyncio.open_connection(host, 80)reader, writer = yield from connectheader = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % hostwriter.write(header.encode('utf-8'))yield from writer.drain()while True:line = yield from reader.readline()if line == b'\r\n':breakprint('%s header > %s' % (host, line.decode('utf-8').rstrip()))# Ignore the body, close the socketwriter.close()loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
结果
wget www.sohu.com...
wget www.sina.com.cn...
wget www.163.com...
(等待一段时间)
(打印出sohu的header)
www.sohu.com header > HTTP/1.1 200 OK
www.sohu.com header > Content-Type: text/html
...
(打印出sina的header)
www.sina.com.cn header > HTTP/1.1 200 OK
www.sina.com.cn header > Date: Wed, 20 May 2015 04:56:33 GMT
...
(打印出163的header)
www.163.com header > HTTP/1.0 302 Moved Temporarily
www.163.com header > Server: Cdn Cache Server V2.0
...
async/await
async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:
把@asyncio.coroutine替换为async;
把yield from替换为await。
aiohttp
asyncio
实现了TCP、UDP、SSL等协议,aiohttp
则是基于asyncio
实现的HTTP框架。
安装aiohttp
pip3 install aiohttp
然后编写一个HTTP服务器,分别处理以下URL:
-
/
- 首页返回b’Index
'; -
/hello/{name}
- 根据URL参数返回文本hello, %s!。
代码如下:
import asynciofrom aiohttp import webasync def index(request):await asyncio.sleep(0.5)return web.Response(body=b'<h1>Index</h1>')async def hello(request):await asyncio.sleep(0.5)text = '<h1>hello, %s!</h1>' % request.match_info['name']return web.Response(body=text.encode('utf-8'))async def init(loop):app = web.Application(loop=loop)app.router.add_route('GET', '/', index)app.router.add_route('GET', '/hello/{name}', hello)srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000)print('Server started at http://127.0.0.1:8000...')return srvloop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
注意aiohttp的初始化函数init()也是一个coroutine,loop.create_server()则利用asyncio创建TCP服务。
相关文章:

Python -- I/O编程
文章目录 一、文件读写1. 读文件2. 二进制文件3. 字符编码4. 写文件 二、StringIO和BytesIO三、操作文件和目录1. 操作系统命令2. 操作文件 四、序列化五、 JSON六、异步IO1. 协程2. asyncioasync/awaitaiohttp 一、文件读写 Python内置了读写文件的函数,用法和C是…...

langchain入门指南和实战
简单介绍 LangChain 是一个开源的语言模型集成框架,旨在简化使用大型语言模型(LLM)创建应用程序的过程。 利用它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人、 调用特定的SaaS服务…...

群晖synology DSM 7.2设置钉钉Webhooks通知
现在越来越多的小伙伴都有了自己的Nas系统,为了更加方便的接收Nas的消息,这篇文章带着大家一起配置一个钉钉(机器人)即时消息通知 首先登录钉钉的开放平台:开发者后台统一登录 - 钉钉统一身份认证 1.创建一个机器人&…...

STP生成树协议详解
一、STP作用 如果链路断开或节点故障,那么互联的设备就无法正常通信了,这类网络问题叫做单点故障。没有备份的链路或节点,出现故障会直接断网。如果要提供 724 小时不间断的服务,那就需要在网络中提前部署冗余。避免出现单点故障…...

CentOS 6/7/8 操作系统镜像下载
CentOS Mirrors List 编辑 DownloadAbout About CentOS Frequently Asked Questions (FAQs) Special Interest Groups (SIGs) CentOS Variants Governance Community Contribute Forums Mailing Lists IRC Calendar & IRC Meeting List Planet Submit a Bug Stories Doc…...

中国社科院与美国杜兰大学金融管理硕士---不将就的人生
“万般皆下品,惟有读书高”、“书中自有颜如玉,书中自有黄金屋”,古往今来,读书的好处为人们所重视。从而想拿到学历没有知识的沉淀,没有一定的学识水平,又怎么能拿到含金量颇高的学历呢?退一步…...

教程更新 | 持续开源 RK3568驱动指南-驱动基础进阶篇
《iTOP-RK3568开发板驱动开发指南》手册文档更新,手册内容对应视频教程,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 ✦ 第一篇 驱动基础 第1章 前言 第2章 你好!内核源码 第3章 …...

Jmeter测试关联接口
Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,本文主要介绍jmeter通过正则表达式提取器来实现接口关联的方式,可供参考。 一、实例场景: 有如下两个接口,通过正则表达式提取器,将第一…...

C++之基于Winsock2封装UDPServer与UDPClient
文章目录 Socket过程UDPServer.hUDPServer.cppUDPClient.hUDPClient.cppmain.cppCMakeLists.txt测试截图 Socket过程 UDPServer UDPClient UDPServer.h #ifndef UDPSERVER_H_INCLUDED #define UDPSERVER_H_INCLUDED#include <iostream> #include <string> #inclu…...

为什么说指针是c语言的灵魂?
为什么说指针是c语言的灵魂? 语言主要操作的对象是数据,c语言里面能够有大容量数据的地方就是指针指向的heap内存。从这 个角度来看,确实指针就是数据的灵魂。最近很多小伙伴找我,说想要一些c语言资料,然后我根据自己…...

性能测试jmeter命令行运行+html测试报告解读
windows下打开jmeter的运行窗口,可以看到提示不要用GUI模式进行负载测试,如果要用负载测试,用cli模式,因为GUI模式运行jmeter比较消耗性能。 命令行模式 windows下找到jemeter所在文件夹,打开cmd输入命令。 jmeter -n…...

Service Mesh和Kubernetes:加强微服务的通信与安全性
文章目录 什么是Service Mesh?Service Mesh的优势1. 流量控制2. 安全性3. 可观测性 Istio:Service Mesh的领军者流量管理安全性可观测性 Linkerd:轻量级Service Mesh流量管理安全性可观测性 Istio vs. Linkerd实际应用结论 🎈个人…...

『吴秋霖赠书活动 | 第三期』《Python asyncio并发编程》
文章目录 1. 写在前面2. 浅谈asyncio3. Python asyncio并发编程 不再受限于!asyncio异步让你的程序在高并发时翱翔自如! 声明:赠书活动是博主与出版社达成合作,只属于粉丝的专属福利 本期书籍:《Python asyncio并发编程…...

数字孪生在工厂领域的应用和优势
工厂运营一直以来都是高度复杂且信息密集的任务。然而,随着数字孪生技术的出现,工厂领域正在经历一场前所未有的革命。本文将介绍数字孪生在工厂领域的应用,以及它如何重新定义了制造业的运营方式。 什么是数字孪生? 数字孪生是…...

如何写代码实现VRP问题中车辆容量限制及时间窗要求(python)
问题研究背景 使用遗传模拟退火算法求解如下10个卸货点的VRPTW问题。为了使研究的问题更加有意义,本人将时间限理解为服务点一天的具体可以允许配送的时间。 如果不要求车辆从配送中心出发的时间是统一的并且为0时刻,那么就默认第一个配送节点是一定能赶…...

C语言求解汉诺塔问题
完整代码: /*Hanoi(汉诺)塔问题。这是一个古典的数学问题:古代有一个梵塔,塔内有 3 个 座 A,B,C,开始时 A 座上有 64 个盘子,盘子大小不等,大的在下,小的在上。有一个老…...

安装LSF
安装需求 基本硬件配置建议: CPU 4核或以上(LSF 没有最低 CPU 需求,此处只是建议)内存 8G或以上( 当没有作业在运行时, Linux x86-64 上集群中的 LSF 守护程序将使用大约 488 MB 内存。)交换…...

百度的新想象力在哪?
理解中国大模型,百度是一个窗口。这个窗口的特殊性不仅在于变化本身,而是在于百度本身就是那个窗口。 作者|皮爷 出品|产业家 沿着首钢园北区向西北步行10分钟,就能看到一个高约90米的大跳台,在工业园钢铁痕迹的印衬下&#…...

Linux使用rpm包安装mysql5.7
以前安装过mysql 前言:检查以前是否装有mysql rpm -qa|grep -i mysql安装了会显示: bt-mysql57-5.7.31-1.el7.x86_64 停止mysql服务和删除之前安装的mysql rpm -e bt-mysql57-5.7.31-1.el7.x86_64查找并删除mysql相关目录 find / -name mysql/va…...

LLDB 三种输出方式 对比及原理探索
前言 当我们的项目过大时,就会使我们项目的编译耗时过长,如何在项目运行时进项代码调试,熟练使用LLDB就可以解决这个难题,大幅度提高我们的开发效率。 什么是 LLDB? LLDB是英文Low Lever Debug的缩写,是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存…...

基于架构软件设计-架构真题(五十八)
“41”视图主要描述系统逻辑架构。其中()视图用于描述对象模型,并说明系统应该为用户提供哪些服务。 过程开发物理逻辑 解析: “41”有逻辑视图、过程视图、物理视图、开发视图和架构的描述。 逻辑视图:设计的对象…...

jvm实现的锁优化
目录 轻量级锁 轻量级锁的工作流程 轻量级锁的解锁 偏向锁 偏向锁的流程: 偏向锁和轻量级锁机区别: 其他优化 自旋锁和自适应自旋锁 锁消除 锁粗化 轻量级锁 “轻量级” 是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的…...

JMeter做http接口功能测试
1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求;…...

【安全体系架构】——SIEM架构
什么是SIEM架构? 安全信息与事件管理(SIEM)架构是一种综合性的安全管理系统,旨在监控、检测、报告和应对安全事件和威胁。SIEM系统集成了多个安全功能,包括日志收集、事件管理、威胁检测和响应,以提供组织…...

nginx acess日志找不到访问记录问题
这个是AI给出的可能得原因: 如果在nginx中找不到你的访问记录,但你确实进行了访问并得到了返回,可能有以下原因: 日志文件位置设置不正确:请确保你的nginx配置文件中的access_log指令指向了正确的日志文件路径。日志文…...

canvas使用
canvas使用 1 canvas绘制基本 1 概念 HTML5<canvas>元素用于图形的绘制,区别于css,它的绘制通过javascript来完成绘制的 <canvas>标签只是图形容器,必须使用及保本来绘制图形 Canvas API主要聚焦与2D图形。同时<canvas>元素的Web…...

PMP认证考试证书领取的通知
各位考生: 2022年6月、7月、8月PMI认证考试证书领取工作已经开始,您可通过以下两种方式领取证书: 1.联系本人所在培训机构,通过培训机构向考点统一代领。 2.在2023年10月20日-10月31日内,登录本网站报名系统个人账户…...

华为云HECS云服务器docker环境下安装nacos
华为云HECS云服务器,安装docker环境,查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 docker pull nacos/nacos-server二、宿主机创建挂载目录 执行如下命令: mkdir -p /usr/local/nacos/logs mkdir -p /usr/local/nacos/con…...

Oracle数据库修改序列,Oracle中的主键值和序列中的值对应不上时的处理方式
select max(stu.id) maxid from student stu; //查询student表中id的最大值select XXX_SEQ.nextval from dual; //查询student表中id对应序列XXX_SEQ的下一个值alter sequence XXX_SEQ increment by 1000; //将序列XXX_SEQ步长改为1000,对应 student表中id的最大值s…...

Verilog基础:避免混合使用阻塞和非阻塞赋值
相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 “避免在一个always块中混杂阻塞赋值和非阻塞赋值”,这条原则是著名的Verilog专家Cliff Cummings在论文SUNG2000中提出的,这个观点在公众讨…...