文件操作
操作文件:读文件、写文件。
读文件:
1、以文本方式去读(字符串)
2、以二进制方式去读(字节)
写文件:
1、以文本的方式去写(字符串)
2、以二进制的方式去写(字节)
写文件:文件写入的内容分为两种情况,第一种是覆盖,第二种是追加:
(1)覆盖:意味着会把文件原先的内容删掉,然后在进行内容的写入
(2)追加:原先的内容保持不变,只是在文件末尾追加写入的内容
假如你打开文件,光标一定会在文件内容的开始。假设现在文件有100个字符串, 第一次读了20个字符,第二次再去读的时候从第一个21个字符开始读,直到读到文件末尾结束。
在Python中提供了一个函数来进行操作文件 --- open()
open:打开一个文件,但是你可以用多种方式打开文件:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
open中的参数:file: 文件(路径+文件名) *
mode: 打开文件的方式 *
buffering: 缓存
encoding: 编码 *
errors: 错误处理的方式
newline: 新行
closefd: close file descriptor: 关闭文件描述符
open的功能:Open file and return a stream --- 打开一个文件并返回一个流(文件流),所以我们真正操作的就是流对象。
open()中的参数mode可以有哪些值:都是字符串
---------------------------------------------------------------------------------------
'r' open for reading (default)
以读的方式打开(默认的)
'w' open for writing, truncating the file first
以写的方式打开,先清空文件的内容
'x' create a new file and open it for writing
创建一个新的文件并以写的方式打开
'a' open for writing, appending to the end of the file if it exists
a: append, 以追加的方式去写
'b' binary mode
二进制
't' text mode (default)
文本(默认)
'+' open a disk file for updating (reading and writing)
打开去更新(读和写)一个磁盘文件
---------------------------------------------------------------------------------------
default:意味着是它默认的打开方式,所以可以不用写
注:打开一个文件,如果操作完成后,记得一定要关闭文件流。
1、去读取file_test.txt中的内容
1.以文本的方式去读
#打开文件
file_obj = open("file_test.txt", "rt", encoding="utf-8")
# file_obj:是一个流的对象
str_data = file_obj.read()
#关闭文件
file_obj.close()
print(str_data)
2、以二进制方式去读
file_obj = open("file_test.txt")
# file_obj:是一个流的对象
str_data = file_obj.read()
#关闭文件
file_obj.close()
print(str_data)
2、去写入file_test.txt中的内容
要加入encoding,关键的原因在于我们要操作中文,如果你的操作的是ASCII所支持的,那么就不需要。
1、以文本的方式去写文件
file_obj = open("file_write.txt", "w", encoding="utf-8")
file_obj.write("现在的时间是下午3:48")
file_obj.close()
file_obj = open("file_test.txt", "w", encoding="utf-8")
file_obj.write("现在的时间是下午3:48")
file_obj.close()
注:以文本的方式去写的时候,如果文件不存在会去创建一个文件。
practise:手动创建一个文件:file1.txt --- 填充内容:用代码操作的第一个文件
操作过程:复制这个文件,先以文本读的方式,读取文件内容,然后以文本方式写入另一个文件file2.txt->file2.txt的内容和file1.txt内容一致。
追加, 以文本的方式去追加。
file_obj = open("file_test.txt", "a", encoding="utf-8")
file_obj.write("今天是2021年10月23日")
file_obj.close()
以上两种方式主要是针对的是文本文件,电脑里边存储的文件:不仅限于文本文件,图片, 视频,音频,除文本之外的文件,我们使用二进制的方式去读,使用二进制的b的时候,必须携带读或者写的方式。
以下是对媒体文件的操作:
file_obj = open("1.jpg", "rb")
data = file_obj.read()
file_obj.close()
print(data)
print(type(data))
#以二进制的形式打开图片
file_obj = open("2.jpg", "wb")
file_obj.write(data)
file_obj.close()
复制图片:
file_obj = open("file_test.txt", "rb")
data = file_obj.read()
file_obj.close()
file_obj = open("file_test_copy.txt", "wb")
file_obj.write(data)
file_obj.close()
读取的方式:
以文本的方式去读的时候:read(n): n代表的就是读取3个字符---默认情况:n = -1, 意味着读取文件中的所有字符。
data = file_obj.read(3)
readline(n): 读取一行内容---readline(n) n = -1 默认读取一行---readline(n) 代表的是读取一行内容的前n个字符。
data = file_obj.readline(3)
file_obj.readline()
readlines: 读取多行---readlines(hint): 默认情况: hint=-1, 读取所有行---返回的是一个列表:列表中的每一个元素,代表一行。
data = file_obj.readlines(10)
hint: 读取hint个字符所在的行。
able: callable, readable------able认为就是是否它具备了一种能力
file_obj.readable()
# 返回值肯定是True或者False
file_obj.close()
print(data)
写与读同样:
是否具备写的能力:
file_obj.writable()
写多行:
writelines(list)
file_obj.writelines(["111\n", "222\n", "333"])
连接字符:
list_data = ["111", "222", "333"]
# 字符串的.join方法:使用一个字符串去连接列表中所有元素
print("\n".join(list_data))
群体换行:字符串的.join方法:使用一个字符串去连接列表中所有元素
file_obj.writelines(["111\n", "222\n", "333"])
#单项换行
file_obj.write("\n".join(["111", "222", "333"]))
#多项换行
输出:def print(*args, sep=' ', end='\n', file=None):
file_obj = open("print_file.txt", "w", encoding="utf-8")
print("这是print的输出内容", file=file_obj)
file_obj.close()
之前我们写操作文件的时候,无论你去读文件或者去写文件,最后一步都是关闭文件
with的关键字,来帮我们去自动关闭,不需要我们去关闭文件了。 所以建议你们后边如果要操作文件的时候,使用with关键字。
with open("print_file.txt", encoding="utf-8") as file_obj:
data = file_obj.read()
print(data)