第九章-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编程的主要内容,如果未能解决你的问题,请参考以下文章

第九章shell脚本编程基础

第九章读书笔记

《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

慕课网javascript 进阶篇 第九章 编程练习

Python之旅.第九章.并发编程