前言
文件处理是任何 Web 应用程序的重要组成部分,当编写的程序需要将数据存储的时候,对于文件的读写操作也就必不可少了。python内置了几个用于处理文件的函数可供选择。
本文将简单介绍文本文件的打开、读取、写入、删除、关闭操作
文件打开
open()
是python中用于打开文件的函数,以下是它的定义
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open()
函数一共有8个参数,但由于后面的七个参数均有默认值,所以实际上必须要提供的参数只有file
,也就是文件名或者文件路径,在日常的使用中,一般我们只提供前两个参数就够了,所以此处也只详细介绍前两个参数
file
是一个 path-like object,表示将要打开的文件的路径(绝对路径或者当前工作目录的相对路径),也可以是要被封装的整数类型文件描述符。如果文件和python文件在同一目录下,那么只需要写文件名就够了
mode
是一个可选字符串,用于指定打开文件的模式。默认值是 'r'
,这意味着它以文本模式打开并读取。可用的模式有:
字符 | 模式 | 意义 |
---|---|---|
'r' | 读取 | 默认值,打开文件进行读取,如果文件不存在则报错 |
'w' | 写入 | 打开文件进行写入,如果文件不存在则创建该文件。 |
'x' | 创建 | 排它性创建,如果文件已存在则返回错误 |
'a' | 追加 | 打开供追加的文件,如果不存在则创建该文件。 |
此外,还可以指定文件是应该作为二进制还是文本模式进行处理。
字符 | 模式 | 意义 |
---|---|---|
‘t' | 文本 | 默认值,文本模式 |
'b' | 二进制 | 二进制模式 |
举个例子,现在我需要创建一个名为test.txt 的文件,以下几种方式都可以实现。 |
open('test.txt','w')
上面这行代码它等同于f = open("test.txt", "rt")
如果是二进制文件,我们可以用
open('test.bat','wb')
但值得注意的是选择'x'
和'r'
的时候要注意文件是否已存在,那么有什么办法可以让我们知道文件到底有没有存在呢?简单,打开文件管理器看一下就好!开玩笑的,这里介绍两种方法
os模块
os模块中的os.path.exists()
方法可以用于检验文件是否存在。
import os
os.path.exists('fileName.txt')
存在返回True
,不存在返回False
。
当然这个方法还可以用来判断文件夹是否存在
import os
os.path.exists('folderName')
同样,存在返回True
,不存在返回False
。
那如果出现文件夹名称和文件名相同怎么办?这时候我们可以用os.path.isfile()
来检验
try语句
如果文件不存在那么就会抛出异常,那我们就可以通过捕获这个异常来判断文件是否存在,在使用open()
函数时,如果文件不存在,那么会抛出FileNotFoundError
的异常。
try:
f = open()
f.close()
except FileNotFoundError:
print ("File is not found.")
文件读取
假设我们有一个文件demofile.txt
且该文件与python文件处于一个相同的文件夹中,文件内容如下:
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
打开
如需打开文件,使用内建的 open()
函数。
open()
函数返回文件对象,此对象有一个 read()
方法用于读取文件的内容:
f = open("demofile.txt", "r")
print(f.read())
输出结果
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
需要注意的是,打开时要确保文件存在,否则会报错。
只读取文件的一部分
如果有时候我们不需要读取全部的文件内容,read()
也可以指定要返回的字符数
f = open("demofile.txt", "r")
print(f.read(5))
上面这段程序就会只返回文件中的前五个字符。
Hello
读取一整行
readline()
方法返回一行内容
f = open("demofile.txt", "r")
print(f.readline())
运行结果
Hello! Welcome to demofile.txt
如果我们需要读取多行,那我们可以循环调用该方法。
通过循环遍历文件中的行,可以逐行读取整个文件
f = open("demofile.txt", "r")
for x in f:
print(x)
运行结果
Hello! Welcome to demofile.txt
This file is for testing purposes.
Good Luck!
也可以使用readlines()
,与readline()
不同的是,readlines()
一次读取整个文件,像 read()
一样。readlines()
会自动将文件内容分析成一个行的列表
为了确保我们打开文件的时候不会出错,我们可以在打开语句外加上try
语句或者先判断一下文件是否存在
# 使用os判断文件是否存在
import os
if os.path.exists('demofile.txt') == True:
f = open('demofile.txt', 'r')
print(f.read())
# 使用try语句
try:
f = open('demofile.txt', 'r')
print(f.read())
except FileNotFoundError:
print("File is not found.")
文件写入
在已有文件中写入
这种情况对应的是open()
函数中"a"
和"w"
两种参数
字符 | 模式 | 意义 |
---|---|---|
'w' | 写入 | 会覆盖任何已有的内容 |
'a' | 追加 | 会追加到文件的末尾 |
举个例子 | ||
打开文件 demofile2.txt 并将内容追加到文件中: |
f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()
# 追加后,打开并读取该文件:
f = open("demofile2.txt", "r")
print(f.read())
运行结果
Hello! Welcome to demofile2.txt
This file is for testing purposes.
Good Luck!Now the file has more content!
这两个参数下使用open()
函数都有一个共同点,文件存在那么直接写入,文件不存在就新建文件写入,也就是说不管怎么样我都要写进去。
创建新文件写入
这个时候我们很明确知道是需要创建新的文件的,那么"x"
、"a"
和"w"
三个参数就都可以使用
字符 | 模式 | 意义 |
---|---|---|
'w' | 写入 | 如果指定的文件不存在,将创建一个文件 |
'x' | 创建 | 排它性创建,如果文件已存在则返回错误 |
'a' | 追加 | 如果指定的文件不存在,将创建一个文件 |
举个例子 | ||
创建名为 "myfile.txt" 的文件: |
f = open("myfile.txt", "x")
文件删除
删除文件就必须要导入os模块了,os模块中的os.remove()
方法可以用于删除文件。
举个例子
删除文件 demofile.txt
import os
os.remove("demofile.txt")
如果需要删除整个文件夹,可以用os.rmdir()
方法来实现
举个例子
删除文件夹 myfolder
import os
os.rmdir("myfolder")
但要注意的是这个方法只能用来删除空文件夹,如果删除的文件夹非空,就会出现如下错误
OSError: [WinError 145] 目录不是空的。: 'myfolder'
为避免出现错误,在尝试删除文件之前我们要检查该文件是否存在,具体方法前面讲了,这里也就不再重复了,最好的办法当然还是用try
语句
文件关闭
关闭文件可以使用close()
来实现
f = open("demofile.txt", "r")
print(f.readline())
f.close()
随时关闭文件绝对是一个好习惯,在某些情况下,由于缓冲,在关闭文件之前,对文件所做的更改可能不会显示。
参考文件
【1】 https://www.cnblogs.com/jhao/p/7243043.html#_label3
【2】https://www.w3school.com.cn/python/python_file_handling.asp
本博客同时发布在CSDN中 https://blog.csdn.net/tangkcc/article/details/113438361?spm=1001.2014.3001.5501
能力有限,如有错误之处,敬请指正!