什么情况下会用到文件操作呢?比如现在各种网盘的上传下载资源,各种CMS中头像上传等等。
文件操作包括文件创建、读写、复制及文件夹相关操作,具体涉及系统函数open、close及os模块。
1、open
要操作文件,首先需要建立和文件的联系,此时需要用到系统提供的函数open:打开文件返回流,抛出OSError。
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=Tr
- file:文件名或者文件路径+文件,我要知道打开哪个文件
- mode:打开模式,具体模式详解表
- buffering:缓存策略
- encoding:编码(文本模式),编码和解码需要保持一致。
- errors:可选性,编码错误处理方式
- newline:指定换行符
2、相关知识点简介
2.1、文本文件和二进制文件
大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
2.2、文件的读和写
相对于我们python可执行程序
2.3、模式
值 | 描述 |
---|
r | 以只读模式打开文件,文件的指针将会放在文件的开头 | rb | 以二进制格式打开文件,并且采用只读模式。文件的指针将会放在文件的开头。一般用于非文本文件,如图片,声音等 | r+ | 打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件开头进行覆盖) | w | 以只写模式打开文件 | wb | 以二进制格式打开文件,并且采用只写模式,一般用于非文本文件,如图片,声音等 | w+ | 打开文件后,先清空原有内容,使其变为一个空的文件,对这个空文件有读写权限 | wb+ | 以二进制格式打开文件,并且采用读写模式,一般用于非文本文件,如图片,声音等 | a | 以追加模式打开一个文件,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | ab | 以二进制格式打开文件,并且采用追加模式,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | ab+ | 以二进制格式打开文件,并且采用追加模式,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于读写 | x | 创建一个新文件用于写 |
- 读文件,当给定的文件不存在时,会报错
- 写文件,当给定的文件不存在时,以给定的名称新创建一个。
2.4、缓存
值 | 描述 |
---|
0 | 关闭缓存(二进制模式) | 1 | 行缓存(文本模式) | >1 | 固定大小的块缓存 |
默认:
- 二进制文件:固定大小的块缓存,大小由底层设备的块大小和io.DEFAULT_BUFFER_SIZE确定;大多数系统块大小为4096或者8192字节
- 文本文件:交互式文本文件使用行缓存;其他同二进制文件
3、读相关函数
- read():读取文件,返回文件内容
- readable():文件是否可读
- readline():读取一行
- readlines():读取多行,返回列表
示例:
stream = open(r"i:/xx.txt")
print(stream.readable())
'''
# read
content = stream.read()
'''
'''
# readline()
while True:
line = stream.readline()
if not line:
break
print(line)
'''
lines = stream.readlines()
print(lines)
for line in lines:
print(line)
stream.close()
- readlines():打印的时候我没看到每行会多打印一行空行
4、写相关函数
- writable():是否可写(修改)
- write():写入
- writelines():写入多行
示例:
stream = open(r"i:/w1.txt", 'w')
print(stream.writable())
s = 'hello aaa'
stream.write(s)
s = 'hello bbb'
stream.write(s)
s = '''
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
'''
stream.writelines(s)
stream.close()
追加:示例
stream = open(r"i:/w1.txt", 'a')
print(stream.writable())
s = 'sfasdfsf'
stream.write(s)
s = 'fsdafd'
stream.write(s)
s = '''
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
'''
stream.writelines(s)
stream.close()
5、close
close用于关闭流,释放资源。打开文件需要占用各种系统资源,如果不及时释放,会严重浪费系统资源,严重可能导致系统崩溃。
6、with open as 变量名
语法:
with open(...) as 变量名
该语法优点在于,不需要在执行close函数,文件操作完成之后,自动帮我们关闭流,释放资源
7、文件复制
示例:简单图片复制
with open(r'i:/1.png', 'rb') as source:
content = source.read()
with open(r'i:/2.png', 'wb') as target:
target.write(content)
源代码仓库:https://gitee.com/gaogzhen/python-study
|