Python基础(10)——文件IO、异常处理、StringIO、BytesIO

文件IO

IO操作,使用open() 函数,还可以使用with上下文关键字来确保打开的文件操作符在退出时被关闭。

1
2
with open(path, mode [, encoding]) as f:
操作...

f.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
f.write() 写文件 # 如果要写入字符串以外的数据,先将他转换为字符串
f.close() 关闭文件
f.readline([size]) 读取整行内容,包括\n字符, 如果给定参数则从文件开始读取指定的字符个数
f.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
f.seek(偏移量,[起始位置]) 用来移动文件指针 #偏移量:单位:比特,可正可负起始位置:0-文件头,默认值;1-当前位置;2-文件尾

mode模式:

open()函数的mode方式详解
open()函数的mode方式详解

os模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import os
os.getcwd() # 返回当前的工作目录 # 获取绝对路径
os.listdir(path) # 返回指定的文件夹包含的文件或文件夹的名字的列表
os.mkdir(path) # 在当前目录下创建新的目录
os.rmdir(path) # 删除目录, 只能删除空目录
os.rename(src, dst) # 对文件进行重命名
os.stat(file) # 获取文件属性
os.remove(file) # 删除文件 #可以将本文件删除
os.path.join(path1, path2) # 路径拼接
os.path.split(path) # 拆分路径 # 返回一个元组(目录, 最后一个文件/目录名称)
os.path.splitext(path) # 获取文件的或站名
os.path.exists(path) # 判断文件/目录是否存在
os.path.isfile(path) # 判断是否是文件
os.path.getsize(file) # 获取文件的大小
os.path.dirname(path) # 获取当前文件的目录
os.path.basename(path) # 获取当前文件/目录名

异常处理

在Python中处理异常使用try...except...[else...][finally...]关键字。

格式:

1
2
3
4
5
6
7
8
9
10
11
try:
try语句
except 异常类1 as 变量1:
异常处理语句1
except 异常类2 as 变量2:
异常处理语句2
...
[else:
else语句]
[finally:
finally语句]

执行顺序:进入try语句块,如果发生错误,依次匹配except中的异常类,匹配成功进入该异常处理块,如果不报错,会执行else中的语句,而finally不管有没有报错都会执行…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def div(x , y):
try:
res = x / y
except ZeroDivisionError as e:
print('除数不能为0')
else:
print(res)
finally:
print('Anyway,I always run')


def main():
div(10, 0)


if __name__ == '__main__':
main()

StringIO

很多时候,数据读写不一定是文件,也可以在内存中读写,而且更快。

StringIO模块主要用于在内存缓冲区中读写数据。它只有一个StringIO类,所以它的可用方法都在类中。此类中的大部分函数都与对文件的操作方法类似。

1
2
3
4
5
6
7
8
9
10
11
12
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!

# getvalue() 方法用于获得写入后的str。

BytesIO

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。BytesIO实现了在内存中读写bytes,先创建一个BytesIO对象,然后写入一些bytes。

1
2
3
4
5
6
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'