Python 文件处理
到目前为止,我们都是从控制台接收输入,并将其写回控制台以与用户交互。
有时,仅在控制台上显示数据是不够的。要显示的数据可能非常大,由于内存易失性,只能在控制台上显示有限量的数据,因此无法一次又一次地恢复以编程方式生成的数据。
当数据需要永久存储到文件中时,文件处理起着重要作用。文件是磁盘上的命名位置,用于存储相关信息。我们可以在程序终止后访问存储的信息(非易失性)。
文件处理在其他编程语言中的实现略显冗长或复杂,但在Python中更简便和简短。
在Python中,文件以文本或二进制两种模式处理。文件可以是文本或二进制格式,并且文件的每一行都以特殊字符结尾。
因此,文件操作可以按以下顺序执行。
- 打开文件
- 读取或写入 – 执行操作
- 关闭文件
打开文件
Python提供了一个 open() 函数,接受两个参数:文件名和文件访问模式。该函数返回一个文件对象,可用于执行各种操作,如读取、写入等。
语法:
file object = open(<file-name>, <access-mode>, <buffering>)
文件可以使用不同的模式进行访问,例如读取、写入或追加。以下是有关打开文件的访问模式的详细信息。
序号 | 访问模式 | 描述 |
---|---|---|
1 | r | 以只读方式打开文件。文件指针存在于文件开头。如果没有传递访问模式,默认以此模式打开文件。 |
2 | rb | 以二进制只读方式打开文件。文件指针存在于文件开头。 |
3 | r+ | 以读写方式打开文件。文件指针存在于文件开头。 |
4 | rb+ | 以二进制读写方式打开文件。文件指针存在于文件开头。 |
5 | w | 它仅打开文件进行写入。如果以前存在文件,则覆盖该文件; 如果不存在具有相同名称的文件,则创建一个新文件。文件指针位于文件的开头。 |
6 | wb | 它以二进制格式仅打开文件进行写入。如果以前存在文件,则覆盖该文件; 如果不存在文件,则创建一个新文件。文件指针位于文件的开头。 |
7 | w+ | 它同时以写入和读取的方式打开文件。与r+不同的是,它会覆盖先前的文件(如果存在),而r+不会覆盖先前写入的文件。如果不存在文件,则创建一个新文件。文件指针位于文件的开头。 |
8 | wb+ | 它在二进制格式下打开文件进行写和读操作。文件指针存在于文件的开头。 |
9 | a | 它以附加模式打开文件。如果先前已写入文件,则文件指针存在于文件末尾。如果没有同名文件存在,则创建一个新文件。 |
10 | ab | 它以二进制附加模式打开文件。指针存在于先前写入文件的末尾。如果没有同名文件存在,则创建一个新的二进制文件。 |
11 | a+ | 它以附加和读取的方式打开文件。如果文件存在,则文件指针保持在文件末尾。如果没有同名文件存在,则创建一个新文件。 |
12 | ab+ | 它以二进制格式打开一个文件进行追加和读取。文件指针保持在文件的末尾。 |
让我们来看一个简单的例子,以读取并在控制台打印名为“file.txt”的文件(存储在同一目录中)的内容。
示例
#opens the file file.txt in read mode
fileptr = open("file.txt","r")
if fileptr:
print("file is opened successfully")
输出:
<class '_io.TextIOWrapper'>
file is opened successfully
在上面的代码中,我们将 文件名 作为第一个参数传递,并以我们将 r 作为第二个参数打开文件以进行读取。文件指针 fileptr 保存文件对象,如果文件成功打开,则会执行打印语句。
close()方法
一旦文件的所有操作都完成了,我们必须通过我们的Python脚本关闭它,使用 close() 方法。一旦在文件对象上调用 close() 方法,任何未写入的信息都会被销毁。
我们可以在Python中打开的当前文件系统上外部执行任何文件操作;因此,在所有操作完成后关闭该文件是个好习惯。
使用 close() 方法的语法如下。
语法
fileobject.close()
考虑以下示例。
# 以读模式打开文件 file.txt
fileptr = open("file.txt","r")
if fileptr:
print("文件已成功打开")
# 关闭已打开的文件
fileptr.close()
关闭文件后,无法在文件中执行任何操作。文件需要正确关闭。如果在文件中执行某些操作时发生任何异常,则程序将在不关闭文件的情况下终止。
我们应该使用以下方法来解决这种问题。
try:
fileptr = open("file.txt")
# 执行文件操作
finally:
fileptr.close()
with 语句
with 语句在 Python 2.5 中引入。在操作文件的情况下,with 语句非常有用。它在一对语句中执行一个代码块的情况下使用。
使用with语句打开文件的语法如下:
with open(<文件名>, <访问模式>) as <文件指针>:
#语句块
使用with语句的优点是,无论嵌套块如何退出,它都提供了关闭文件的保证。
对于文件,建议始终使用 with 语句,因为如果代码的嵌套块出现break、return或异常,它会自动关闭文件,不需要编写 close() 函数。它不会使文件损坏。
考虑以下示例:
示例
with open("file.txt",'r') as f:
content = f.read();
print(content)
写文件
要向文件中写入文本,我们需要使用open方法打开文件,而且需要选择以下其中一种访问模式。
w: 如果文件存在,则会覆盖该文件。文件指针位于文件的开头。
a: 如果文件存在,则会在现有文件中追加文本。文件指针位于文件的末尾。如果没有文件存在,则会创建一个新文件。
请考虑以下示例。
示例1
# 以追加模式打开 file.txt。如果不存在该文件,则创建一个新文件。
fileptr = open("file2.txt", "w")
# 向文件追加内容
fileptr.write('''Python 是现代的编程语言,它使事情变得如此简单。
它是增长最快的编程语言''')
# 关闭已打开的文件
fileptr.close()
输出:
File2.txt
Python是现代化的语言。它让事情变得如此简单。它是增长最快的编程语言。
文件file2.txt的快照
我们以 w 模式打开文件。 file1.txt 文件不存在,因此创建了一个新文件,并使用 write() 函数将内容写入文件。
示例2
#以追加模式打开file2.txt文件。
fileptr = open("file2.txt","a")
#覆盖文件内容
fileptr.write("Python具有易于理解的语法和用户友好的交互。")
#关闭已打开的文件
fileptr.close()
输出:
Python是现代的语言。它使事情变得如此简单。
它是发展最快的编程语言,Python具有易于理解的语法和用户友好的交互。
文件file2.txt的快照
我们可以看到文件的内容已经被修改了。我们以 a 模式打开了文件,并将内容添加到了现有的 file2.txt 文件中。
要使用Python脚本读取文件,Python提供了 read() 方法。这个方法从文件中读取一个字符串。它可以读取文本和二进制格式的数据。
read() 方法的语法如下。
语法:
fileobj.read(<count>)
这里,count 是从文件开头开始读取的字节数。如果未指定 count,则可能会读取文件的全部内容。
考虑以下示例。
示例3
#以读模式打开 file.txt 文件。如果找不到此文件,则会引发错误。
fileptr = open("file2.txt","r")
#将文件的所有数据存储到变量 content 中
content = fileptr.read(10)
# 打印文件中存储的数据类型
print(type(content))
#打印文件的内容
print(content)
#关闭已打开的文件
fileptr.close()
输出:
Python is
在上面的代码中,我们使用了 read() 函数读取了 file2.txt 文件的内容。我们将count值设为十,这意味着它将从文件中读取前十个字符。
如果我们使用以下行,则会打印出文件的所有内容。
content = fileptr.read()
print(content)
输出:
Python is the modern-day language. It makes things so simple.
It is the fastest-growing programing language Python has easy an syntax and user-friendly interaction.
通过for循环读取文件
我们可以使用for循环读取文件。考虑以下示例。
#以读取模式打开file.txt。如果没有该文件,则会导致错误。
fileptr = open("file2.txt","r");
#运行一个for循环
for i in fileptr:
print(i) # i 包含文件的每一行
输出:
Python是现代的编程语言。
它使事情变得非常简单。
Python拥有简单的语法和用户友好的交互。
读取文件的行
Python通过使用函数 readline() 来逐行读取文件。readline()方法从文件的开头开始读取文件的行,即如果我们使用readline()方法两次,则可以获取文件的前两行。
考虑以下示例,其中包含一个函数 readline() ,它读取包含三行的文件 “file2.txt” 的第一行。考虑以下示例。
示例1:使用readline()函数读取行
#以读取模式打开file.txt文件,如果文件不存在则引发错误。
fileptr = open("file2.txt","r");
#将文件的所有数据存储到变量content中
content = fileptr.readline()
content1 = fileptr.readline()
#打印文件内容
print(content)
print(content1)
#关闭已打开的文件
fileptr.close()
输出:
Python是现代语言。
它使事情变得如此简单。
我们调用了 readline() 函数两次,所以它从文件中读取了两行。
Python还提供了 readlines() 方法用于读取行。它返回直到达到 文件末尾(EOF) 的行的列表。
示例2:使用readlines()函数读取行
#在读取模式下打开file.txt文件。如果不存在该文件,则会出错。
fileptr = open("file2.txt","r");
#将文件的所有数据存储在变量content中
content = fileptr.readlines()
#打印文件的内容
print(content)
#关闭打开的文件
fileptr.close()
输出:
['Python是现代化的语言。\n', '它使事情变得非常简单。\n', 'Python具有易于理解的语法和用户友好的交互。']
创建一个新文件
使用open()函数和以下访问模式之一可以创建新文件。
x: 它使用指定的名称创建一个新文件。如果存在同名文件,会导致错误。
a: 如果不存在这样的文件,则创建一个带有指定名称的新文件。如果已存在具有指定名称的文件,则将内容添加到该文件。
w: 如果不存在这样的文件,则创建一个带有指定名称的新文件。它会覆盖现有文件。
考虑以下例子。
示例1
#在读取模式下打开file.txt。如果没有这样的文件,则会出错。
fileptr = open("file2.txt","x")
print(fileptr)
if fileptr:
print("文件创建成功")
输出:
<_io.TextIOWrapper name='file2.txt' mode='x' encoding='cp1252'>
文件创建成功
文件指针位置
Python提供了tell()方法,用于打印文件指针当前所在的字节号。考虑以下例子。
#以读取模式打开文件file2.txt
fileptr = open("file2.txt","r")
#最初文件指针在0处
print("文件指针在字节位置:",fileptr.tell())
#读取文件内容
content = fileptr.read();
#读取操作后文件指针修改。tell()返回文件指针的位置。
print("读取后,文件指针在:",fileptr.tell())
输出:
文件指针位于字节:0
读取后,文件指针位于:117
修改文件指针位置
在现实世界的应用中,我们有时需要外部改变文件指针的位置,因为我们可能需要在不同的位置读取或写入内容。
为此,Python 提供了 seek() 方法,使我们能够在外部修改文件指针的位置。
使用 seek() 方法的语法如下所示。
语法:
<文件指针>.seek(偏移量[, 起始位置])
seek() 方法接受两个参数:
偏移量: 它指的是文件中文件指针的新位置。
来自: 它指示要移动字节的参考位置。如果将其设置为0,则使用文件的开头作为参考位置。如果将其设置为1,则使用文件指针的当前位置作为参考位置。如果将其设置为2,则使用文件指针的末尾作为参考位置。
考虑以下示例。
示例
# 以读取模式打开文件file2.txt
fileptr = open("file2.txt","r")
# 初始时,文件指针为0
print("文件指针处于字节位置:",fileptr.tell())
# 将文件指针位置更改为10
fileptr.seek(10);
# tell() 返回文件指针的位置
print("读取后,文件指针处于位置:",fileptr.tell())
输出结果:
文件指针在字节位置:0
读取后,文件指针在:10
Python OS模块
重命名文件
Python的 os 模块可以与操作系统进行交互。os模块提供了与文件处理操作(如重命名、删除等)相关的函数。它提供了一个rename()方法来将指定的文件重命名为新文件名。使用rename()方法的语法如下所示。
语法:
rename(当前名称, 新名称)
第一个参数是当前文件名,第二个参数是修改后的名称。通过传递这两个参数,我们可以更改文件名字。
示例 1:
import os
#将file2.txt重命名为file3.txt
os.rename("file2.txt","file3.txt")
输出:
上述代码将当前的 file2.txt 重命名为 file3.txt
删除文件
os模块提供了 remove() 方法,用于删除指定的文件。使用 remove() 方法的语法如下所示。
remove(文件名)
Example 1
import os;
#删除名为file3.txt的文件
os.remove("file3.txt")
创建新目录
mkdir() 方法用于在当前工作目录中创建目录。创建新目录的语法如下。
语法:
mkdir(目录名称)
示例1
import os
# 创建一个名为new的新目录
os.mkdir("new")
getcwd()方法
该方法返回当前的工作目录。
使用getcwd()方法的语法如下。
语法
os.getcwd()
示例
import os
os.getcwd()
输出:
'C:\\Users\\DEVANSH SHARMA'
改变当前工作目录
chdir()方法用于将当前工作目录更改为指定的目录。
使用chdir()方法的语法如下所示。
语法:
chdir("new-directory")
示例:
import os
# 使用新目录更改当前目录
os.chdir("C:\\Users\\DEVANSH SHARMA\\Documents")
# 显示当前工作目录
os.getcwd()
输出:
'C:\\Users\\DEVANSH SHARMA\\Documents'
删除目录
使用rmdir()方法来删除指定的目录。
下面是使用rmdir()方法的语法。
语法
os.rmdir(目录名称)
示例1
import os
#删除新目录
os.rmdir("目录名称")
它将删除指定的目录。
将Python输出写入文件
在Python中,有要求将Python脚本的输出写入文件。
模块subprocess的 check_call() 方法用于执行Python脚本,并将该脚本的输出写入文件。
以下示例包含两个Python脚本。脚本file1.py执行脚本file.py并将其输出写入文本文件 output.txt 。
示例
file.py
temperatures=[10,-20,-289,100]
def c_to_f(c):
if c< -273.15:
return "That temperature doesn't make sense!"
else:
f=c*9/5+32
return f
for t in temperatures:
print(c_to_f(t))
file.py
import subprocess
with open("output.txt", "wb") as f:
subprocess.check_call(["python", "file.py"], stdout=f)
文件相关方法
文件对象提供以下方法以在各种操作系统上操作文件。
SN | 方法 | 描述 |
---|---|---|
1 | file.close() | 它关闭打开的文件。一旦关闭文件,就不再能够读取或写入。 |
2 | File.fush() | 它刷新内部缓冲区。 |
3 | File.fileno() | 它返回底层实现用于从操作系统请求I/O的文件描述符。 |
4 | File.isatty() | 如果文件连接到TTY设备,则返回true,否则返回false。 |
5 | File.next() | 它返回文件中的下一行。 |
6 | File.read([size]) | 它按指定的大小读取文件。 |
7 | File.readline([size]) | 它从文件中读取一行,并将文件指针定位到新行的开头。 |
8 | File.readlines([sizehint]) | 它返回一个包含文件中所有行的列表。它使用readline()函数读取文件,直到遇到EOF。 |
9 | File.seek(offset[,from) | 它将文件指针的位置修改为指定的偏移量和参考位置。 |
10 | File.tell() | 它返回文件指针在文件中的当前位置。 |
11 | File.truncate([size]) | 它将文件截断为可选的指定大小。 |
12 | File.write(str) | 它将指定的字符串写入文件。 |
13 | File.writelines(seq) | 它将字符串序列写入文件。 |