Python 文件处理
Python 文件处理
到目前为止,我们从控制台获取输入,并将其写回控制台,以便与用户进行交互。
有时候,仅仅在控制台上显示数据是不够的。要显示的数据可能非常大,并且只能在控制台上显示有限数量的数据,因为内存是易失性的,不可能一次又一次地恢复以编程方式生成的数据。
当数据需要永久存储到文件中时,文件处理起着重要的作用。文件是磁盘上存储相关信息的命名位置。我们可以在程序终止后访问存储的信息(非易失性的)。
在其他编程语言中,文件处理实现略长或复杂,但在 Python 中,它更简单、更短。
在 Python 中,文件在两种模式下被视为文本或二进制文件。文件可以是文本或二进制格式,文件的每一行都以特殊字符结尾。
因此,文件操作可以按以下顺序进行。
打开文件
读取或写入-执行操作
关闭文件
打开文件
Python 提供了一个 open() 函数,接受两个参数,文件名和访问文件的访问模式。该函数返回一个文件对象,该对象可用于执行各种操作,如读取、写入等。
语法:
file object = open(<file-name>, <access-mode>, <buffering>) |
可以使用各种模式(如读取、写入或追加)来访问这些文件。以下是有关打开文件的访问模式的详细信息。
存取方式 | 描述 |
---|---|
r | 它以只读模式打开文件。文件指针存在于开头。如果没有通过访问模式,默认情况下,文件在此模式下是打开的。 |
rb | 它以二进制格式将文件打开为只读。文件指针存在于文件的开头。 |
r+ | 它打开文件进行读写。文件指针存在于文件的开头。 |
rb+ | 它以二进制格式打开文件进行读写。文件指针存在于文件的开头。 |
w | 它打开文件只写。如果文件以前存在,它会覆盖该文件;如果不存在同名文件,它会创建一个新文件。文件指针存在于文件的开头。 |
wb | 它打开文件,只以二进制格式写入。如果文件以前存在,它会覆盖该文件;如果没有文件,它会创建一个新文件。文件指针存在于文件的开头。 |
w+ | 它打开文件进行读写。它与 r+的不同之处在于,如果存在先前的文件,它会覆盖先前的文件,而 r+不会覆盖先前写入的文件。如果没有文件,它会创建一个新文件。文件指针存在于文件的开头。 |
wb+ | 它以二进制格式打开文件进行读写。文件指针存在于文件的开头。 |
a | 它以追加模式打开文件。文件指针存在于先前写入的文件(如果存在)的末尾。如果不存在同名文件,它会创建一个新文件。 |
ab | 它以二进制格式在追加模式下打开文件。指针存在于先前写入的文件的末尾。如果不存在同名文件,它会创建一个二进制格式的新文件。 |
a+ | 它打开一个文件来附加和读取两者。如果文件存在,文件指针将保留在文件的末尾。如果不存在同名文件,它会创建一个新文件。 |
ab+ | 它打开一个文件,以二进制格式追加和读取两者。文件指针保持在文件的末尾。 |
让我们看一个简单的例子,以读取模式打开一个名为"file.txt"(存储在同一个目录中)的文件,并在控制台上打印其内容。
例子
#opens the file file.txt in read mode |
输出:
<class '_io.TextIOWrapper'> |
在上面的代码中,我们传递了filename作为第一个参数,并以读取模式打开了文件,正如我们提到的 r 作为第二个参数。文件程序保存文件对象,如果文件打开成功,它将执行打印语句
close()方法
一旦文件上的所有操作完成,我们必须使用 close() 方法通过 Python 脚本关闭它。一旦在文件对象上调用 close() 方法,任何未写的信息都会被销毁。
我们可以使用当前在 Python 中打开的文件系统在外部对文件执行任何操作;因此,最好在所有操作完成后关闭文件。
下面给出了使用 close() 方法的语法。
语法
fileobject.close() |
考虑下面的例子。
# opens the file file.txt in read mode |
关闭文件后,我们无法在文件中执行任何操作。该文件需要正确关闭。如果在文件中执行某些操作时出现任何异常,程序将终止,而不会关闭文件。
我们应该用下面的方法来克服这类问题。
try: |
with 语句
python 2.5 中引入了带有语句的with 语句在操作文件的情况下很有用。它用于一对语句之间要执行一段代码的场景。
下面给出了使用和语句打开文件的语法。
with open(<file name>, <access mode>) as <file-pointer>: |
使用 with 语句的优点是,无论嵌套块如何退出,它都能保证关闭文件。
在文件的情况下总是建议使用with语句,因为如果中断、返回或异常发生在嵌套的代码块中,那么它会自动关闭文件,我们不需要编写 close() 函数。它不会让文件损坏。
考虑下面的例子。
例子
with open("file.txt",'r') as f: |
正在写入文件
要向文件中写入一些文本,我们需要使用 open 方法以下列访问模式之一打开文件。
w: 如果有文件存在,会覆盖文件。文件指针在文件的开头。
a: 将追加已有文件。文件指针在文件的末尾。如果没有文件,它会创建一个新文件。
考虑下面的例子。
例子
# open the file.txt in append mode. Create a new file if no such file exists. |
输出:
File2.txt
Python is the modern-day language. It makes things so simple. It is the fastest growing programming language. |
文件快照 2.txt
我们已经在 w 模式下打开了文件。file1.txt 文件不存在,它创建了一个新文件,我们已经使用 write() 函数在文件中写入了内容。
例 2
#open the file.txt in write mode. |
输出:
Python is the modern day language. It makes things so simple. |
文件快照 2.txt
我们可以看到文件的内容被修改了。我们已经在模式下打开了该文件,并在现有的file2.txt中添加了内容。
要使用 Python 脚本读取文件,Python 提供了 read() 方法。 read() 方法从文件中读取一个字符串。它可以读取文本和二进制格式的数据。
read() 方法的语法如下。
语法:
fileobj.read(<count>) |
这里,计数是从文件的开头开始要从文件中读取的字节数。如果没有指定计数,那么它可以读取文件的内容直到结束。
考虑下面的例子。
例子
#open the file.txt in read mode. causes error if no such file exists. |
输出:
<class 'str'> |
在上面的代码中,我们已经使用 read() 函数读取了file2.txt 的内容。我们将计数值传递为十,这意味着它将从文件中读取前十个字符。
如果我们使用下面一行,那么它将打印文件的所有内容。
content = fileptr.read() |
输出:
Python is the modern-day language. It makes things so simple. |
循环读取文件
我们可以使用 for
循环来读取文件。考虑下面的例子。
#open the file.txt in read mode. causes an error if no such file exists. |
输出:
Python is the modern day language. |
读取文件的行
Python 通过使用函数 readline() 方法来方便逐行读取文件。 readline() 方法从头开始读取文件的行,也就是说,如果我们使用 readline()方法两次,那么我们就可以得到文件的前两行。
考虑下面的例子,它包含一个函数 readline() ,该函数读取我们的文件file2.txt的第一行,该文件包含三行。考虑下面的例子。
示例 1:使用 readline()函数读取行
#open the file.txt in read mode. causes error if no such file exists. |
输出:
Python is the modern day language. |
我们两次调用了 readline() 函数,这就是它从文件中读取两行的原因。
Python 还提供了用于读取行的读取行()方法。它返回行的列表,直到到达文件(EOF) 的末尾。
示例 2:使用 readlines()
函数读取行
#open the file.txt in read mode. causes error if no such file exists. |
输出:
['Python is the modern day language.\n', 'It makes things so simple.\n', 'Python has easy syntax and user-friendly interaction.'] |
创建新文件
在函数 open()的情况下,可以使用以下访问模式之一创建新文件。
x: 它用指定的名称创建一个新文件。如果存在同名文件,则会导致错误。
a: 如果不存在指定名称的文件,则创建该文件。如果具有指定名称的文件已经存在,它会将内容追加到文件中。
w: 如果不存在指定名称的文件,它会创建一个新文件。它会覆盖现有文件。
考虑下面的例子。
例 1
#open the file.txt in read mode. causes error if no such file exists. |
输出:
<_io.TextIOWrapper name='file2.txt' mode='x' encoding='cp1252'> |
文件指针位置
Python 提供了 tell()方法,用于打印文件指针当前所在的字节数。考虑下面的例子。
# open the file file2.txt in read mode |
输出:
The filepointer is at byte : 0 |
修改文件指针位置
在现实应用中,有时我们需要从外部更改文件指针位置,因为我们可能需要在不同的位置读取或写入内容。
为此,Python 为我们提供了 seek()
方法,使我们能够在外部修改文件指针的位置。
下面给出了使用 seek()
方法的语法。
语法:
<file-ptr>.seek(offset[, from) |
seek()
方法接受两个参数:
**偏移量:**指文件指针在文件内的新位置。
from: 表示字节移动的参考位置。如果设置为 0,文件的开头将用作参考位置。如果设置为 1,文件指针的当前位置将用作参考位置。如果设置为 2,文件指针的末端将用作参考位置。
考虑下面的例子。
例子
# open the file file2.txt in read mode |
输出:
The filepointer is at byte : 0 |
Python os
模块
重命名文件
Python os 模块支持与操作系统的交互。os 模块提供文件处理操作中涉及的功能,如重命名、删除等。它为我们提供了 rename()方法,将指定的文件重命名为新名称。下面给出了使用**重命名()**方法的语法。
语法:
rename(current-name, new-name) |
第一个参数是当前文件名,第二个参数是修改后的名称。我们可以绕过这两个参数来更改文件名。
例 1:
import os |
输出:
以上代码将当前file2.txt 重命名为file3.txt
正在删除文件
os 模块提供 remove() 方法,用于删除指定的文件。下面给出了使用 remove() 方法的语法。
remove(file-name) |
例 1
import os; |
创建新目录
mkdir() 方法用于创建当前工作目录中的目录。下面给出了创建新目录的语法。
语法:
mkdir(directory name) |
例 1
import os |
getcwd()方法
此方法返回当前工作目录。
下面给出了使用 getcwd()方法的语法。
语法
os.getcwd() |
例
import os |
输出:
'C:\\Users\\DEVANSH SHARMA' |
更改当前工作目录
chdir()方法用于将当前工作目录更改为指定目录。
下面给出了使用 chdir()方法的语法。
语法
chdir("new-directory") |
例子
import os |
输出:
'C:\\Users\\DEVANSH SHARMA\\Documents' |
正在删除目录
rmdir()方法用于删除指定的目录。
下面给出了使用 rmdir()方法的语法。
语法
os.rmdir(directory name) |
例 1
import os |
它将删除指定的目录。
将 Python 输出写入文件
在 Python 中,需要将 Python 脚本的输出写入文件。
模块子流程的 check_call() 方法用于执行 Python 脚本,并将该脚本的输出写入文件。
以下示例包含两个 python 脚本。脚本文件 1.py 执行脚本文件. py,并将其输出写入文本文件 output.txt.
例
temperatures=[10,-20,-289,100] |
import subprocess |
文件相关方法
文件对象提供以下方法来操作各种操作系统上的文件。
方法 | 描述 |
---|---|
file.close() | 它关闭打开的文件。文件一旦关闭,就不能再读写了。 |
File.flush() | 它会刷新内部缓冲区。 |
File.fileno() | 它返回底层实现用来向操作系统请求输入/输出的文件描述符。 |
File.isatty() | 如果文件连接到 TTY 设备,则返回 true,否则返回 false。 |
File.next() | 它返回文件的下一行。 |
file.read([size]) | 它读取指定大小的文件。 |
file.readline([size]) | 它从文件中读取一行,并将文件指针放在新行的开头。 |
file.readline([sizehint]) | 它返回一个包含文件所有行的列表。它使用 readline()函数读取文件,直到发生 EOF。 |
File.seek(offset[,from) | 它将文件指针的位置修改为具有指定引用的指定偏移量。 |
File.tell() | 它返回文件指针在文件中的当前位置。 |
file.truncate([size]) | 它会将文件截断到可选的指定大小。 |
File.write(str) | 它将指定的字符串写入文件 |
File.writelines(seq) | 它将一系列字符串写入文件。 |