Python 文件处理

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的快照

Python 文件处理

我们以 w 模式打开文件。 file1.txt 文件不存在,因此创建了一个新文件,并使用 write() 函数将内容写入文件。

示例2

#以追加模式打开file2.txt文件。
fileptr = open("file2.txt","a")

#覆盖文件内容   
fileptr.write("Python具有易于理解的语法和用户友好的交互。")  

#关闭已打开的文件   
fileptr.close()

输出:

Python是现代的语言。它使事情变得如此简单。
它是发展最快的编程语言,Python具有易于理解的语法和用户友好的交互。

文件file2.txt的快照

Python 文件处理

我们可以看到文件的内容已经被修改了。我们以 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) 它将字符串序列写入文件。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程