# Python教程 - 8 文件操作
# 8.1 文件编码
计算机只能识别0和1,计算机保存在硬盘上也是保存为0和1的。那么文本文件是如何显示为我们认识的文字呢?
在将文字保存到硬盘的时候,通过某种编码,将文字转换为0和1保存到硬盘,从硬盘读取的时候,再按照这种编码进行解码,翻译成文字显示出来。
计算机中常用的编码有:GBK、UTF-8、ISO88859-1等。
我们在保存和读取的时候,需要使用相同的编码,如果保存和读取编码不一致,会出现乱码。
目前使用最广泛的编码是UTF-8,也成为万国码,基本上所有的语言都支持,没有特殊要求,建议一律使用UTF-8来编码。
# 8.2 文件读取
文件读取主要分为三步:
- 打开文件
- 读写文件
- 关闭文件
# 1 打开文件
在Python中,使用open函数,可以打开一个在硬盘上存在的文件,或者创建一个新文件,语法如下:
open(path, mode, encoding)
path:要打开的文件的路径
mode:打开文件的访问模式:只读、写入、追加等
encoding:编码格式,推荐使用UTF-8,该参数的位置不是第三位,需要使用关键字来传参。
常用的mode有:
模式 | 说明 |
---|---|
r | 以只读的方式打开文件,这是默认模式 |
w | 以写入的方式打开文件,如果文件已存在,会从头开始写入,原有内容会被删除,如果该文件不存在,则创建新文件写入。 |
a | 以追加的方式打开文件,如果文件已存在,则新内容会被追加到已有内容之后,如果文件不存在,则创建新的文件写入。 |
举个栗子:
file = open("test.txt", "r", encoding="UTF-8")
open()函数返回的是一个文件对象,该对象拥有一些属性和方法,可以对文件进行操作。
# 2 读取文件
方式一:
文件对象.read(num)
read()函数可以用来读取文件,num参数表示读取的数据内容的长度,单位是字节,如果没有传入num,则会读取文件所有的数据。
方式二:
文件对象.readline()
readline()函数可以读取文件的一行数据,第二次调用,则读取第二行数据。
方式三:
文件对象.readlines()
readlines()函数可以按照行来读取文件数据,但是是一次性读取到一个列表中,每一行数据为一个元素。
方式四:
for line in open("test.txt", "r")
print(line)
2
使用for循环来读取文件的内容,每一次的line记录了文件的一行数据。
# 3 关闭文件
关闭文件使用close()方法。
f = open("test.txt", "r")
f.close() # 关闭文件
2
文件操作完毕,一定要关闭文件对象,如果不调用close,那么文件会一直被Python程序占用。
如果怕忘记关闭可以使用 with open
语法
with open("test.txt", "r") as file:
file.readlines()
2
通过在with open的语句块中操作文件,操作完成会自动关闭文件。
# 4 操作演示
现在演示文件的读取,所以首先新建一个文本文件,内容自定义。
然后编写Python代码如下:
file = open("test.txt", "r", encoding="UTF-8")
content = file.read() # 读取文件所有内容
print(content)
file.close() # 关闭文件
2
3
4
上面文件的路径就是"test.txt",因为我的文件就是放在和Python文件同目录。如果你放在D盘,可以写 open("D:\\test.txt", "r", encoding="UTF-8")
。
# 8.3 文件写入
文件的写入也是四个步骤:
- 打开文件
- 文件写入
- 刷新内容(这一步可以省略)
- 关闭文件
举个栗子:
file = open("test.txt", "w", encoding="UTF-8") # 1 打开文件
file.write("hello world") # 2 文件写入
file.flush() # 3 刷新内容
file.close() # 4 关闭文件
2
3
4
执行完成,会在python文件所在目录生成一个test.txt文件。
"w"是写入模式,如果文件不存在会创建文件,如果文件存在,会清空原有的内容。
调用write()方法,内容并没有真正写入的到文件,而是写入到内存中的缓冲区,这样是为了避免频繁的操作硬盘,提高效率。
当调用flush()方法的时候,内容会真正写入到硬盘。但是调用close()函数,是自带flush功能的,所以这里不调用flush()方法也是可以的。
如果文件内容很多,我们想在写入的过程中将内容多次写入到硬盘,可以中途调用flush()函数。
# 8.4 追加写入
追加模式,只要修改文件的操作方式为"a"。
举个栗子:
file = open("test.txt", "a", encoding="UTF-8") # 1 打开文件
file.write("hello world") # 2 文件写入
file.flush() # 3 刷新内容
file.close() # 4 关闭文件
2
3
4
a模式,文件不存在,也会创建文件,如果文件存在会追加写入。
在写入内容的时候,可以使用 \n
来进行换行。
# 8.5 文件复制
复制一个文件的内容写入到另外一个文件。
file1 = open("file1.txt", "r", encoding="UTF-8") # 打开文件
file2 = open("file2.txt", "w", encoding="UTF-8")
content = file1.read() # 从file1读取文件
file2.write(content) # 将内容写入到file2
file1.close() # 关闭文件
file2.close()
2
3
4
5
6
7
8
上面是读取到一个文件的全部内容,然后写入到另外一个文件。
如果文件非常大,这样操作会非常占内存,最好是一行一行读取,一行一行写入。
# 打开文件
file1 = open("file1.txt", "r", encoding="UTF-8")
file2 = open("file2.txt", "w", encoding="UTF-8")
# 循环一行一行读取和写入
while True:
text = file1.readline() # 每次读取一行
# 判断是否读取到内容
if not text:
break
file2.write(text)
# 关闭文件
file1.close()
file2.close()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17