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+不同,如果文件已存在,则覆盖之前的文件;如果不存在,则创建新文件。文件指针位于开头。 |
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。文件指针持有文件对象,如果文件成功打开,它将执行打印语句。
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 的快照
我们以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 的快照
我们可以看到文件的内容已被修改。我们以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 脚本的输出写入文件。
模块 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))
file1.py
import subprocess
with open("output.txt", "wb") as f:
subprocess.check_call(["python", "file.py"], stdout=f)
文件相关方法
文件对象提供了以下方法来操作各种操作系统上的文件。
序号 | 方法 | 描述 |
---|---|---|
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) | 它将字符串序列写入文件。 |