第九章-IO编程
IO是输出输入的意思
在计算机中常用到的数据交换的地方是磁盘, 网络等
输入流是从外面(磁盘, 网络)流进内存
输出流是从内存流到外面(磁盘, 网络)
同步IO是指等待IO完成再继续执行
异步IO是在IO操作的时候CPU继续执行别的工作
同步和异步的区别就在于是否等待IO执行的结果
1 文件的读写
2 StringIO和BytesIO
2.1 StringIO
通过导入io模块来获得StringIO
StringIO是在内存中读取str
通过write()写入内容
通过getvalue()方法获得的得到的内容str
同样可以逆向操作, 读内存str, 此时可以使用read()和readline()方法
具体操作如下
from io import StringIO str = StringIO()
str.write("hello")
str.write(" ")
str.write("world")
print(str.getvalue())
str = StringIO('Hello!\nHi!\nGoodbye!')
print(str.read())
2.2 BytesIO
StringIO操作的只能是str, 如果要操作二进制数据, 就需要使用BytesIO
同样需要通过导入io模块来获得BytesIO
在Python中str类型是Unicode, 想要获得bytes需要使用encode方法会编码
获得bytes内容用getvalue()
读取bytes内容用read()
具体实例如下
from io import BytesIO f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
# b'\xe4\xb8\xad\xe6\x96\x87' f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(f.read())
3 操作文件和目录
导入os模块可以实现操作系统的dir, cp等功能
import os
查看操作系统类型, posix是Linux系列操作系统, nt是win系列系统
os.name
获取详细系统信息, unama()只是linux系统有
os.uname()
查看环境变量
os.environ
要获取某个环境变量的值
os.environ.get('PATH')
查看当前目录的绝对路径
os.path.abspath('.')
创建目录路径, 这样就可以避免在不同操作系统的路径分割符不同引起的问题
os.path.join('/Users/michael', 'testdir')
拆分路径, 可以将绝对路径分割成目录和文件名字
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
拆分路径, 可以将绝对路径分割成目录和文件后缀
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
创建目录
os.mkdir('/Users/michael/testdir')
删除目录
os.rmdir('/Users/michael/testdir')
文件的重命名
os.rename('test.txt', 'test.py')
文件的删除
os.remove('test.py')
列出当前文件夹的所有文件夹
[x for x in os.listdir('.') if os.path.isdir(x)]
列出当前文件夹的所有py文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
4 序列化
4.1 序列化
程序中的数据如某个字典如果程序结束后, 这个字典也就在内存中释放了, 如果想要把内容保存起来的话, 就需要存入存储器或者网络中国
此时有个快捷的方式是序列化
序列化(pickling)又叫做serialization,marshalling,flattening等等
具体实现可以导入pickle模块实现
写成存储形式需要使用dumps()方法, 传入需要序列化的对象即可
如果dumps()的第二个参数传入一个文件句柄的话, 就可以把内容存入到文件中, 不过文件需要以二进制模式写入
对应的, 可以通过二进制方式读取文件, 可以通过load()方法来实现
具体实例如下
>>> 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.'
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
4.2 JSON
除了通过序列化, 还可以通过JSON来保存获取数据
通过导入json模块来实现功能
可以通过dunps()函数来完成存储, 并且会返回一个处理好的字符串类型的数据
对应的可以通过load()方法来解析json
具体实例如下
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}
如果需要存储诸如类这样的数据的时候, 是无法存储的
dumples()函数有个默认参数default, 可以通过给default传入一个函数来实现对对象数据的处理
具体一般使用lambda表达式来将类对象转化为 __dct__ 属性
对应的, 取得值的函数是loads(), 要通过对object_hook来传入 处理字符串的函数
具体两个例子如下
print(json.dumps(s, default=lambda obj: obj.__dict__)) def dict2student(d):
return Student(d['name'], d['age'], d['score']) >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
第九章-IO编程的更多相关文章
- python3-cookbook笔记:第九章 元编程
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
- 第九章伪代码编程过程 The PseudoCode Programming Process
目录: 1.创建类和子程序的步骤概述 2.伪代码 3.通过伪代码编程过程创建子程序 4.伪代码编程过程的替代方案 一.创建类和子程序的步骤概述 (1)创建一个类的步骤 1.创建类的总体设计 2.创建类 ...
- C++ Primer第九章课后编程问题
1. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0J ...
- Android初级教程理论知识(第九章多媒体编程)
多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...
- File类与常用IO流第九章——转换流
第九章.转换流 字节编码和字符集 编码:按照某种规则将字符以二进制存储到计算机中. 解码:将存储在计算机中的二进制数按照某种规则解析显示出来. 字符编码:Character Encoding ,就是一 ...
- [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】
第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
- Java编程思想 第九章 接口
第九章 接口 抽象类和抽象方法 抽象:从具体事物抽出.概括出它们共同的方面.本质属性与关系等,而将个别的.非本质的方面.属性与关系舍弃,这种思维过程,称为抽象. 这句话概括了抽象的概念,而在Java中 ...
- JavaScript DOM编程艺术-学习笔记(第八章、第九章)
第八章 1.小知识点: ①某些浏览器要根据DOCTYPE 来决定页面的呈现模式(标准模式 / 怪异模式--也称兼容模式): 兼容模式意味着浏览器要模仿老一辈的浏览器的怪异行为,来让老站点得到运行,并让 ...
随机推荐
- iOS开发 使用Cocoapods管理第三方类库
每次上github看到一些优秀的代码,总能看到Podfile,也了解是个管理第三方类库的,今天抽时间学习了一下,挺简单的! 作用: 太多 还是复制一下把!!! CocoaPods是什么? ...
- XmlNode与XmlElement的区别总结
原文链接:http://www.cnblogs.com/oilsun/archive/2012/07/07/2580427.html 今 天在做ASP.NET操作XML文档的过程中,发现了两个类:Xm ...
- 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优
怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优 1>.这里简单举个样例来说明DBMS_SQLTUN ...
- 如何把网页或html内容生成图片
网页或html内容生成图片 今天想把做好的html内容或网页生成一张图片,没有网页在线版的生成或转换工具,除非下载客户端软件使用. 不过,发现可以利用搜狗高速浏览器和360浏览器生成图片,这里讲解 ...
- MQTT 测试工具介绍
eclipse paho 下载地址为: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org ...
- Regex 手机号 座机 正則表達式
近期在工作中须要推断一个号码是否是手机号,是否是座机号. 在网上也搜到了大家总结的方法,没有直接使用这些方法是由于:手机号码在不断開始新的号码段(比方17x).座机号中个别区号由于行政区域的变化而废除 ...
- unix改变shell显示颜色
编写shell脚本的时候.通过改变shell的显示颜色,不但可以改变使用shell终端的体验,并且更为有用的是,可以通过改变显示内容的颜色来区分正常输出.warning和error等不同关注级别的输出 ...
- iphone手机连接USB时出现须要Mobile device setup disk上的usbaapl.sys文件
问题: iphone5 手机连接USB出现例如以下弹框 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5nZWwyMnh1/font/5a6L5L2T/ ...
- Finder 快捷键
记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...
- 关于mongodb副本集读写分离 及 日志切换
mongodb的读写分离使用Replica Sets来实现 对于replica set 中的secondary 节点默认是不可读的.在写多读少的应用中,使用Replica Sets来实现读写分离.通过 ...