# 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)
1

path:要打开的文件的路径

mode:打开文件的访问模式:只读、写入、追加等

encoding:编码格式,推荐使用UTF-8,该参数的位置不是第三位,需要使用关键字来传参。

常用的mode有:

模式 说明
r 以只读的方式打开文件,这是默认模式
w 以写入的方式打开文件,如果文件已存在,会从头开始写入,原有内容会被删除,如果该文件不存在,则创建新文件写入。
a 以追加的方式打开文件,如果文件已存在,则新内容会被追加到已有内容之后,如果文件不存在,则创建新的文件写入。

举个栗子:

file = open("test.txt", "r", encoding="UTF-8")
1

open()函数返回的是一个文件对象,该对象拥有一些属性和方法,可以对文件进行操作。

# 2 读取文件

方式一:

文件对象.read(num)
1

read()函数可以用来读取文件,num参数表示读取的数据内容的长度,单位是字节,如果没有传入num,则会读取文件所有的数据。

方式二:

文件对象.readline()
1

readline()函数可以读取文件的一行数据,第二次调用,则读取第二行数据。

方式三:

文件对象.readlines()
1

readlines()函数可以按照行来读取文件数据,但是是一次性读取到一个列表中,每一行数据为一个元素。

方式四:

for line in open("test.txt", "r")
		print(line)
1
2

使用for循环来读取文件的内容,每一次的line记录了文件的一行数据。

# 3 关闭文件

关闭文件使用close()方法。

f = open("test.txt", "r")
f.close()										# 关闭文件
1
2

文件操作完毕,一定要关闭文件对象,如果不调用close,那么文件会一直被Python程序占用。

如果怕忘记关闭可以使用 with open 语法

with open("test.txt", "r") as file:
    file.readlines()
1
2

通过在with open的语句块中操作文件,操作完成会自动关闭文件。

# 4 操作演示

现在演示文件的读取,所以首先新建一个文本文件,内容自定义。

然后编写Python代码如下:

file = open("test.txt", "r", encoding="UTF-8")
content = file.read()															# 读取文件所有内容
print(content)
file.close()																			# 关闭文件
1
2
3
4

上面文件的路径就是"test.txt",因为我的文件就是放在和Python文件同目录。如果你放在D盘,可以写 open("D:\\test.txt", "r", encoding="UTF-8")

# 8.3 文件写入

文件的写入也是四个步骤:

  1. 打开文件
  2. 文件写入
  3. 刷新内容(这一步可以省略)
  4. 关闭文件

举个栗子:

file = open("test.txt", "w", encoding="UTF-8")      # 1 打开文件
file.write("hello world")                           # 2 文件写入
file.flush()                                        # 3 刷新内容
file.close()                                        # 4 关闭文件
1
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 关闭文件
1
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()
1
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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17