Python第九章 文件操作
第九章 文件操作
9.1 文件概述
9.1.1 文件的编码
编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。
为什么要使用编码:计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码, 将计算机保存的0和1,反向翻译回可以识别的内容。
计算机中有许多可用编码:UTF-8、GBK、Big5等。不同的编码,将内容翻译成二进制也是不同的。
【说明】GBK是过去中文常用的编码,以及Big5是繁体的编码。现在UTF-8已经包括了中文,所以以后文件读取时的打开操作大都使用UTF-8即可
编码有许多,所以要使用正确的编码, 才能对文件进行正确的读写操作呢。
![]() |
![]() |
---|
如上,如果你给喜欢的女孩发送文件,使用编码A进行编码(内容转二进制)。女孩使用编码B打开文件进行解码(二进制反转回内容)
【理解】这里说一下我的理解,文本程序打开文件时,都是从硬盘上打开,读取的也都是01二进制文件,经过文本程序按照编码规则翻译之后才形成了看到的文本。程序在操作文件的时候,都是从二进制文件开始。
可以使用Windows系统自带的记事本,打开文件后,即可看出文件的编码是什么:
【再次强调】UTF-8是目前全球通用的编码格式。除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
9.1.2 什么是文件
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
9.2 文件操作
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。
9.2.1 打开、关闭文件
操作 | 功能 |
---|---|
文件对象 = open(file, mode, encoding) | 打开文件获得文件对象 |
文件对象.close() | 关闭文件对象 |
with open() as f | 通过with open语法打开文件,可以自动关闭 |
- 以读方式打开文件时,如果文件不存在,会报错
9.2.1 读操作
操作 | 功能 |
---|---|
文件对象.read([num]) | 读取指定长度字节,不指定num读取文件全部 |
文件对象.readline() | 读取一行 |
文件对象.readlines() | 读取全部行,得到列表 |
for line in 文件对象 | for循环文件行,一次循环得到一行数据 |
【说明】文件读取也就这四种方式了
下面逐一展示
使用的文件是D:/test.txt
,里面的内容是
第一行内容:1234567
第二行内容:7654321
第三行内容:abcdefg
第四行内容:gfedcba
第五行内容:一二三四五六七
第六行内容:七六五四三二一
第七行内容:一去二三里
第八行内容:八九十枝花
1、文件对象.read(num)、文件对象.read()
f = open("D:/test.txt", "r", encoding="UTF-8")
# print(f) # <_io.TextIOWrapper name='D:/test.txt' mode='r' encoding='UTF-8'>
# print(type(f)) # <class '_io.TextIOWrapper'>
print(f"读取10个字节的内容:{f.read(10)}")
print(f"再读取全部的内容:{f.read()}")
输出的内容为
读取10个字节的内容:第一行内容:1234
再读取全部的内容:567
第二行内容:7654321
第三行内容:abcdefg
第四行内容:gfedcba
第五行内容:一二三四五六七
第六行内容:七六五四三二一
第七行内容:一去二三里
第八行内容:八九十枝花
【说明】
- 一个汉字,一个中文符号,一个数字都是一个字节
- 读取文件的时候是有指针的,本次读取只能从上一次读取到的位置开始读取
2、文件对象.readlines()
f = open("D:/test.txt", "r", encoding="UTF-8")
lines = f.readlines() # <class 'list'>
print(type(lines))
for line in lines:
print(line) # 每一行都打印,注意每一行的内容后面有一个\n,print之后也会有换行,因此会有两个换行
输出效果为,中间隔着一行
第一行内容:1234567
第二行内容:7654321
第三行内容:abcdefg
readlines()与read()共享指针
f = open("D:/test.txt", "r", encoding="UTF-8")
f.read()
lines = f.readlines()
print(lines) # [], read()已经将指针移到了最后了
3、文件对象.readline()
这个只读取一行
f = open("D:/test.txt", "r", encoding="UTF-8")
line = f.readline()
print(line) # 第一行内容:1234567
同样地,与read()共享指针
f = open("D:/test.txt", "r", encoding="UTF-8")
print(f.read(7)) # 第一行内容:1
print(f.readline()) # 234567
4、for遍历文件行
for in 文件的时候,每次都遍历一行
f = open("D:/test.txt", "r", encoding="UTF-8")
for line in f: # 相当于for line in f.readlines()
print(line, end='')
5、读取后注意文件的关闭
【说明】如果不关闭文件,那么文件会一直被Python程序打开,而不能操作
6、使用with open语法操作文件
使用这种方法操作文件,操作完之后可以自动关闭文件
with open("D:/test.txt", "r", encoding="UTF-8") as f:
for line in f:
print(line, end='')
# 文件会自动关闭
【理解】这种结构很合理,with open下面会有所进,说明下面一整筐的代码都属于操作文件的范围内
9.2.2 写操作
相关方法
操作 | 功能 |
---|---|
f = open('python.txt', 'w') | 以写的方式打开文件 |
文件对象.write("内容") | 将内容写入到内存的缓冲区当中 |
文件对象.flush() | 将缓冲区的内容写入到硬盘当中 |
f.close() | 关闭文件,自带flush()操作 |
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 这样做(不是write的时候写入硬盘)是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
- close函数自带了flush方法,也就是说close文件的时候也会执行flush操作
- 当程序结束的时候,会自动执行close关闭文件,还是建议文件使用结束之后就关闭文件
下面逐一演示
1、以w方式打开文件
- 如果文件不存在,会创建新文件
- 如果文件存在,会将原有内容清空
f = open("D:/test.txt", "w", encoding="UTF-8")
2、文件对象.write(),而不flush()
import time
f = open("D:/test.txt", "w", encoding="UTF-8")
f.write("hello,world") # 仅仅写到了内存当中
time.sleep(500000) # 暂停,不关闭文件
会发现文件创建了,但是里面并没有内容,因为并没有将文件写入到硬盘当中,文本程序读取文件是从硬盘读取的
【说明】write是不带换行的,如果要换行,要自动添加
\n
符号
3、文件对象.write(),flush()
f = open("D:/test.txt", "w", encoding="UTF-8")
f.write("hello, world")
f.write("hello, world2")
f.flush() # 写入到硬盘当中
f.close()
4、close()自带flush()
执行文件对象.close()的时候会自动执行flush()操作
9.2.3 追加操作
操作 | 功能 |
---|---|
f = open('python.txt', 'a') | 以追加的方式打开文件 |
文件对象.write("内容") | 将内容追加到内存的缓冲区当中 |
文件对象.flush() | 将缓冲区的内容写入到硬盘当中 |
f.close() | 关闭文件,自带flush()操作 |
1、f = open('python.txt', 'a') 追加方式打开文件
- a模式,文件不存在会创建文件
- a模式,文件存在会在最后,追加写入文件
2、文件对象.write()、文件对象.flush()
同样的,只有flush之后才能写入到文件中
f = open("D:/test.txt", "a", encoding="UTF-8")
f.write("\nhello, worl5")
f.write("\nhello, world10")
f.flush()
f.close()
【说明】write同样没有换行操作,如果要换行,可以自行在前面添加\n操作
【下面演示一个复制操作】
src_file = open("D:/test.txt", "r", encoding="UTF-8")
dst_file = open("D:/bill.txt", "w", encoding="UTF-8")
dst_file.write(src_file.read())
dst_file.flush()
src_file.close()
dst_file.close()