第九章-IO编程
Posted weihuchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章-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编程的主要内容,如果未能解决你的问题,请参考以下文章
《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记