一、IO编程:
1. 本章介绍的IO都是同步IO。
二、文件读写
1. 读文件
1.1 f = open('try.py', 'r') # 读文件之前,需要首先打开文件。指定文件名和读方式,返回文件对象。
1.2 f.read() # 一次性读取文件的全部内容。返回的是str对象。
1.3 f.read(size) # 读取指定字节的文件内容。返回的是str对象。
1.4 f.readline() # 读取一行内容。返回的是str对象。
1.5 f.readlines() # 按行读取所有内容。返回的是list对象。
1.6 f.close():
1.6.1 读取文件完成后,务必关闭文件对象。
1.6.2 可以在try...finaly...的finaly语句体中关闭。
1.6.3 可以通过with语句打开文件:with open('/path/to/file', 'r') as f: 在with语句的语句体中执行对文件的操作。该语句体执行完毕后,会自动关闭文件对象。
2. file-like Object:
2.1 有read方法的对象统称为file-like Object。
2.2 包括文件流,内存字节流,网络流, 自定义流等。
2.3 StringIO就是在内存中创建的file-link Object,常用作临时缓冲。
3. 二进制文件:读取文本文件时,使用'r'方式打开文件;读物二进制文件如图片、视频等时,用'rb'方法打开文件。
4. 字符编码:
4.1 fd = open('admin.xml', 'r', encoding='gbk', errors='ignore')说明如下:
4.2 默认使用utf-8编码方式打开文件;
4.3 通过默认参数encoding可以使用指定的编码方式打开文件;
4.4 当打开文件时,遇到个别非法字符时,可以指定默认参数errors指定该种情况的处理方式;
5. 写入文件:
5.1 'w': 写入文本文件;原文件内容被删除。
5.2 'wb':写入二进制文件;
5.3 'a':追加文本内容到文件;
三、StringIO:只能操作str。
1. 示例一
from io import StringIO # 导入StringIO fd = StringIO() # 创建StringIO对象 fd.write('write something') # 通过write方法向StringIO写入str。 content = fd.getvalue() # 获取写入StringIO对象中的内容。
2. 示例二:
from io import StringIO # 导入StringIO fd = StringIO('Hello\nlfc\nni hao') # 使用str初始化StringIO后,可以向操作文件对象一样读取StringIO。 content = fd.readlines()
四、BytesIO:只能操作二进制数据
1. 操作方式与StringIO类似;
五、操作文件和目录
1. 导入os模块后,os.name可以查看操作系统的类型。
1.1 'posix':Linux、Unix或Mac OS X
1.2 'nt':Windows系统
2. os模块的某些函数和操作系统相关。比如os.uname()函数可以查看系统的详细信息,但只能在linux类系统中使用。
3. 环境变量
3.1 os.environ变量中保存有系统的环境变量。
3.2 os.environ.get('PATH') # 查看系统的环境变量,区分大小写。
4. 操作文件和目录:
4.1 可以使用os、os.path和shutil(比如提供了复制文件的函数copyfile())模块。
4.2 os.path.abspath('./os') # 查看绝对路径。
4.3 os.path.join('dir1', 'dir2') # 用于将两个路径合并。
4.4 os.path.split('dir') # 用于将路径拆分成含有两个元素的tuple,后一个元素是dir路径最下层的子目录或文件。
4.4.1 由于Windows和Linux下路径的连字符分别是'\'和'/'。所以最好不直接拼接字符串。
4.5 os.path.splitext('dir') # 将dir查分成含有两个元素的tuple,后一个元素为文件的扩展名。
4.6 os.mkdir('dir') # 创建目录
4.7 os.rmdir('dir') # 删除目录
4.8 shutil.copyfile('srcfile', 'destfile') # 拷贝文件内容
4.9 [ subdir for subdir in os.listdir(''.') if os.path.isdir(subdir) ] #列出当前目录的子目录。
4.10 [ pyfile for pyfile in os.listdir('.') if os.path.splitext(pyfile)[1] == '.py' ] # 列出当前目录下所有扩展名为.py的文件
4.11 os.path.isfile('dir') 或 os.path.isdir('dir') # 判断dir是文件或目录,dir必须是相对路径或决定路径,不能仅仅是一个字符创。
六、序列化
1. 把变量从内存中变成可存储或传输的过程称为序列化。
2. pickle
2.1 python提供pickle模块实现序列化。
2.2 pickle.loads(var) # 将变量var中的内容序列化,返回字节串。
2.3 pickle.dumps(bytes) # 将字节串反序列化成内存中可读的变量的值。
2.4 pickle.dump(var, fp) # 将变量var序列化,并保存在文件fp中。
2.5var = pickle.load(fp) # 读取文件fp的内容,并反序列化后存储在变量var中。
2.6缺点:仅能用于python,且python不同版本的支持情况可能不一样,程序可移植性低。
3. json
3.1 变量用json序列化后是字符串str类型。
3.2 json同样拥有loads, dumps, load, dump方法。
3.3 json序列化或反序列化类对象,需要将类对象进行转换。