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  
fileptr = open("file.txt","r")

if fileptr:
print("file is opened successfully")

输出:

<class '_io.TextIOWrapper'>
file is opened successfully

在上面的代码中,我们传递了filename作为第一个参数,并以读取模式打开了文件,正如我们提到的 r 作为第二个参数。文件程序保存文件对象,如果文件打开成功,它将执行打印语句

close()方法

一旦文件上的所有操作完成,我们必须使用 close() 方法通过 Python 脚本关闭它。一旦在文件对象上调用 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 语句

python 2.5 中引入了带有语句的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()

输出:

File2.txt

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

文件快照 2.txt

Python File Handling

我们已经在 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.

文件快照 2.txt

Python File Handling

我们可以看到文件的内容被修改了。我们已经在模式下打开了该文件,并在现有的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循环来读取文件。考虑下面的例子。

#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()方法两次,那么我们就可以得到文件的前两行。

考虑下面的例子,它包含一个函数 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 还提供了用于读取行的读取行()方法。它返回行的列表,直到到达文件(EOF) 的末尾。

示例 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()方法接受两个参数:

**偏移量:**指文件指针在文件内的新位置。

from: 表示字节移动的参考位置。如果设置为 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 模块支持与操作系统的交互。os 模块提供文件处理操作中涉及的功能,如重命名、删除等。它为我们提供了 rename()方法,将指定的文件重命名为新名称。下面给出了使用**重命名()**方法的语法。

语法:

rename(current-name, new-name)  

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

例 1:

import os  

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

输出:

以上代码将当前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 脚本的输出写入文件。

模块子流程check_call() 方法用于执行 Python 脚本,并将该脚本的输出写入文件。

以下示例包含两个 python 脚本。脚本文件 1.py 执行脚本文件. 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)

文件相关方法

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

方法描述
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)它将一系列字符串写入文件。

原文:https://www.javatpoint.com/python-files-io