到目前为止,我们一直从控制台获取输入并将其写回控制台以与用户交互。

有时,仅在控制台上显示数据是不够的。要显示的数据可能非常大,由于内存易失性,只能在控制台上显示有限量的数据,无法反复从程序中生成数据。

文件处理在数据需要永久存储到文件中时发挥重要作用。文件是磁盘上的命名位置,用于存储相关信息。我们可以在程序终止后访问存储的信息(非易失性)。

文件处理在其他编程语言中的实现可能稍显冗长或复杂,但在Python中更简单和更短。

在Python中,文件以文本或二进制两种模式处理。文件可以是文本格式或二进制格式,文件的每一行都以特殊字符结尾。

因此,文件操作可以按以下顺序进行。

  • 打开文件
  • 读取或写入 - 执行操作
  • 关闭文件

打开文件

Python提供了一个名为open()的函数,该函数接受两个参数:文件名和访问模式。函数返回一个文件对象,可以用于执行各种操作,如读取、写入等。

语法:

file object = open(<file-name>, <access-mode>, <buffering>)     

可以使用各种模式访问文件,如读取、写入或追加。以下是有关打开文件的访问模式的详细信息。

序号访问模式描述
1r以只读模式打开文件。文件指针位于开头。如果不传递访问模式,默认情况下文件以此模式打开。
2rb以只读二进制格式打开文件。文件指针位于开头。
3r+以读写模式打开文件。文件指针位于开头。
4rb+以读写二进制格式打开文件。文件指针位于开头。
5w以只写模式打开文件。如果文件已存在,则覆盖该文件;如果不存在,则创建新文件。文件指针位于开头。
6wb以只写二进制格式打开文件。如果文件已存在,则覆盖该文件;如果不存在,则创建新文件。文件指针位于开头。
7w+以读写模式打开文件。与r+不同,如果文件已存在,则覆盖之前的文件;如果不存在,则创建新文件。文件指针位于开头。
8wb+以读写二进制格式打开文件。文件指针位于开头。
9a以追加模式打开文件。文件指针位于已写入文件的末尾,如果文件不存在,则创建新文件。
10ab以追加模式打开二进制格式文件。文件指针位于已写入文件的末尾,如果文件不存在,则创建新文件。
11a+以追加和读取模式打开文件。文件指针位于文件末尾(如果文件存在)。如果文件不存在,则创建新文件。
12ab+以追加和读取模式打开二进制格式文件。文件指针位于文件末尾。

让我们看一个简单的例子,以只读模式打开名为“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。文件指针持有文件对象,如果文件成功打开,它将执行打印语句。

close() 方法

在对文件执行所有操作后,我们必须通过Python脚本使用close()方法关闭它。一旦调用文件对象上的close()方法,任何未写入的信息都会被销毁。

我们可以通过文件系统在Python中打开的文件进行任何操作;因此,在完成所有操作后关闭文件是良好的实践。

使用close()方法的语法如下。

语法

fileobject.close()   

考虑以下示例。

# opens the file file.txt in read mode    
fileptr = open("file.txt","r")    
    
if fileptr:    
    print("file is opened successfully")    
    
#closes the opened file    
fileptr.close()  

关闭文件后,就无法对文件执行任何操作。文件需要被适当地关闭。如果在文件中执行某些操作时发生任何异常,程序将终止而不关闭文件。

我们应该使用以下方法来解决此类问题。

try:  
   fileptr = open("file.txt")  
   # perform file operations  
finally:  
   fileptr.close() 

with 语句

with语句是在Python 2.5中引入的。with语句在操作文件时非常有用。它用于在一对语句中执行一个代码块的情况下。

使用with语句打开文件的语法如下。

with open(<file name>, <access mode>) as <file-pointer>:    
    #statement suite   

使用with语句的好处在于,它保证无论嵌套块如何退出,都会关闭文件。

在文件中使用with语句始终是一个建议性的做法,因为如果嵌套块中发生中断、返回或异常,它会自动关闭文件,无需编写close()函数。它不会让文件损坏。

考虑以下示例。

示例

with open("file.txt",'r') as f:    
    content = f.read();    
    print(content)    

写入文件

要将一些文本写入文件,我们需要使用带有以下访问模式之一的open方法打开文件。

w: 如果文件存在,则覆盖该文件。文件指针位于文件开头。

a: 追加到现有文件。文件指针位于文件末尾。如果没有文件存在,则创建一个新文件。

考虑以下示例。

示例

# open the file.txt in append mode. Create a new file if no such file exists.  
fileptr = open("file2.txt", "w")  
  
# appending the content to the file  
fileptr.write('''''Python is the modern day language. It makes things so simple. 
It is the fastest-growing programing language''')  
  
# closing the opened the file  
fileptr.close()  

输出:

文件2.txt

Python is the modern-day language. It makes things so simple. It is the fastest growing programming language.

file2.txt 的快照

Python 文件处理

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

示例 2

#open the file.txt in write mode.    
fileptr = open("file2.txt","a")  
    
#overwriting the content of the file    
fileptr.write(" Python has an easy syntax and user-friendly interaction.")    
      
#closing the opened file     
fileptr.close()  

输出:

Python is the modern day language. It makes things so simple.
It is the fastest growing programing language Python has an easy syntax and user-friendly interaction.

file2.txt 的快照

Python 文件处理

我们可以看到文件的内容已被修改。我们以a模式打开了文件,并且它将内容追加到现有的file2.txt

要使用Python脚本读取文件,Python提供了read()方法。read()方法从文件中读取一个字符串。它可以以文本和二进制格式读取数据。

read() 方法的语法如下。

语法:

fileobj.read(<count>)    

这里的数量是从文件开始处读取的字节数。如果未指定数量,则它可能会读取文件内容直到结束。

考虑以下示例。

示例

#open the file.txt in read mode. causes error if no such file exists.    
fileptr = open("file2.txt","r")  
#stores all the data of the file into the variable content    
content = fileptr.read(10)   
# prints the type of the data stored in the file    
print(type(content))      
#prints the content of the file    
print(content)       
#closes the opened file    
fileptr.close()  

输出:

<class 'str'>
Python is 

在上面的代码中,我们使用read()*函数读取了*file2.txt的内容。我们将计数值设置为十,这意味着它会从文件中读取前十个字符。

如果我们使用以下行,则会打印文件的所有内容。

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 循环读取文件。考虑以下示例。

#open the file.txt in read mode. causes an error if no such file exists.    
fileptr = open("file2.txt","r");     
#running a for loop     
for i in fileptr:    
    print(i) # i contains each line of the file     

输出:

Python is the modern day language.

It makes things so simple.

Python has easy syntax and user-friendly interaction.

逐行读取文件

Python 通过函数readline()方法来逐行读取文件。readline()方法从文件的开头读取行,并将文件指针放在新行的开头。

考虑以下示例,其中包含一个readline()函数,它读取包含三行的文件"file2.txt"的第一行。

示例 1:使用readline()函数读取行

#open the file.txt in read mode. causes error if no such file exists.    
fileptr = open("file2.txt","r");     
#stores all the data of the file into the variable content    
content = fileptr.readline()     
content1 = fileptr.readline()  
#prints the content of the file    
print(content)     
print(content1)  
#closes the opened file    
fileptr.close()    

输出:

Python is the modern day language.

It makes things so simple.

我们调用了readline()函数两次,这就是为什么它从文件中读取了两行。

Python 还提供了readlines()方法,用于逐行读取。它返回到文件结束为止的所有行的列表。

示例 2:使用readlines()函数读取行

#open the file.txt in read mode. causes error if no such file exists.    
fileptr = open("file2.txt","r");     
    
#stores all the data of the file into the variable content    
content = fileptr.readlines()     
  
#prints the content of the file    
print(content)     
    
#closes the opened file    
fileptr.close()    

输出:

['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.    
fileptr = open("file2.txt","x")   
print(fileptr)    
if fileptr:    
    print("File created successfully")  

输出:

<_io.TextIOWrapper name='file2.txt' mode='x' encoding='cp1252'>
File created successfully 

文件指针位置

Python 提供了tell()方法,用于打印文件指针当前所在的字节数。考虑以下示例。

# open the file file2.txt in read mode    
fileptr = open("file2.txt","r")    
  
#initially the filepointer is at 0     
print("The filepointer is at byte :",fileptr.tell())    
    
#reading the content of the file    
content = fileptr.read();    
    
#after the read operation file pointer modifies. tell() returns the location of the fileptr.     
    
print("After reading, the filepointer is at:",fileptr.tell())    

输出:

The filepointer is at byte : 0
After reading, the filepointer is at: 117

修改文件指针位置

在实际应用中,有时我们需要在外部更改文件指针位置,因为我们可能需要在不同位置读取或写入内容。

为此,Python 提供了seek()方法,允许我们在外部修改文件指针位置。

seek()方法的语法如下所示。

语法:

<file-ptr>.seek(offset[, from)    

seek()方法接受两个参数:

偏移量: 它指的是文件内部文件指针的新位置。

参考位置: 表示从哪里移动字节。如果设置为 0,则使用文件开头作为参考位置。如果设置为 1,则使用文件指针的当前位置作为参考位置。如果设置为 2,则使用文件指针的末尾作为参考位置。

考虑以下示例。

示例

# open the file file2.txt in read mode    
fileptr = open("file2.txt","r")    
    
#initially the filepointer is at 0     
print("The filepointer is at byte :",fileptr.tell())    
    
#changing the file pointer location to 10.    
fileptr.seek(10);    
    
#tell() returns the location of the fileptr.     
print("After reading, the filepointer is at:",fileptr.tell())    

输出:

The filepointer is at byte : 0
After reading, the filepointer is at: 10

Python 的 os 模块

重命名文件

Python 的 os 模块允许与操作系统进行交互,提供了涉及文件处理操作(如重命名、删除等)的函数。它提供了 rename() 方法,用于将指定的文件重命名为新名称。rename() 方法的语法如下。

语法:

rename(current-name, new-name)    

第一个参数是当前文件名,第二个参数是修改后的名称。通过这两个参数可以更改文件名。

示例 1:

import os    
    
#rename file2.txt to file3.txt    
os.rename("file2.txt","file3.txt")  

删除文件

os 模块提供了 remove() 方法,用于删除指定的文件。remove() 方法的语法如下。

remove(file-name)   

示例 1:

import os;    
#deleting the file named file3.txt     
os.remove("file3.txt")    

创建新目录

mkdir() 方法用于在当前工作目录中创建目录。创建新目录的语法如下。

语法:

mkdir(directory name)  

示例 1:

import os    
    
#creating a new directory with the name new    
os.mkdir("new")    

getcwd() 方法

此方法返回当前的工作目录。

使用 getcwd() 方法的语法如下。

语法:

os.getcwd()  

示例:

import os  
os.getcwd()  

输出:

'C:\\Users\\DEVANSH SHARMA'

更改当前工作目录

chdir() 方法用于将当前工作目录更改为指定目录。

使用 chdir() 方法的语法如下。

语法:

chdir("new-directory")    

示例:

import os   
# Changing current directory with the new directiory  
os.chdir("C:\\Users\\DEVANSH SHARMA\\Documents")  
#It will display the current working directory  
os.getcwd()  

输出:

'C:\\Users\\DEVANSH SHARMA\\Documents'

删除目录

rmdir() 方法用于删除指定的目录。

使用 rmdir() 方法的语法如下。

语法:

os.rmdir(directory name)    

示例 1:

import os  
#removing the new directory     
os.rmdir("directory_name")    

将会删除指定的目录。

将 Python 输出写入文件

在 Python 中,有时需要将 Python 脚本的输出写入文件。

模块 subprocesscheck_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))    

file1.py

import subprocess    
    
with open("output.txt", "wb") as f:    
    subprocess.check_call(["python", "file.py"], stdout=f)    

文件相关方法

文件对象提供了以下方法来操作各种操作系统上的文件。

序号方法描述
1File.close()它关闭打开的文件。文件一旦关闭,就无法再读取或写入。
2File.fush()它刷新内部缓冲区。
3File.fileno()它返回底层实现用来向操作系统请求 I/O 的文件描述符。
4File.isatty()如果文件连接到 TTY 设备,则返回 true,否则返回 false。
5File.next()它返回文件中的下一行。
6File.read([size])它读取指定大小的文件。
7File.readline([size])它从文件中读取一行并将文件指针放置到新行的开头。
8File.readlines([sizehint])它返回一个包含文件所有行的列表。它使用 readline() 函数读取文件,直到 EOF 发生。
9File.seek(offset[,from)它将文件指针的位置修改为具有指定引用的指定偏移量。
10File.tell()它返回文件指针在文件中的当前位置。
11File.truncate([size])它将文件截断为可选的指定大小。
12File.write(str)它将指定的字符串写入文件
13File.writelines(seq)它将字符串序列写入文件。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程