📜  Python文件I / O

📅  最后修改于: 2020-10-24 09:16:56             🧑  作者: Mango

Python文件处理

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

有时仅在控制台上显示数据是不够的。要显示的数据可能非常大,并且由于内存易失,因此只能在控制台上显示有限数量的数据,因此无法一次又一次地恢复以编程方式生成的数据。

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

在其他编程语言中,文件处理实现有些冗长或复杂,但在Python中则更容易,也更短。

在Python,文件在两种模式下被视为文本或二进制。该文件可以是文本格式或二进制格式,并且文件的每一行都以特殊字符结束。

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

  • 开启档案
  • 读取或写入-执行操作
  • 关闭档案

开启档案

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

句法:

file object = open(, , )   

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

SN Access mode Description
1 r It opens the file to read-only mode. The file pointer exists at the beginning. The file is by default open in this mode if no access mode is passed.
2 rb It opens the file to read-only in binary format. The file pointer exists at the beginning of the file.
3 r+ It opens the file to read and write both. The file pointer exists at the beginning of the file.
4 rb+ It opens the file to read and write both in binary format. The file pointer exists at the beginning of the file.
5 w It opens the file to write only. It overwrites the file if previously exists or creates a new one if no file exists with the same name. The file pointer exists at the beginning of the file.
6 wb It opens the file to write only in binary format. It overwrites the file if it exists previously or creates a new one if no file exists. The file pointer exists at the beginning of the file.
7 w+ It opens the file to write and read both. It is different from r+ in the sense that it overwrites the previous file if one exists whereas r+ doesn’t overwrite the previously written file. It creates a new file if no file exists. The file pointer exists at the beginning of the file.
8 wb+ It opens the file to write and read both in binary format. The file pointer exists at the beginning of the file.
9 a It opens the file in the append mode. The file pointer exists at the end of the previously written file if exists any. It creates a new file if no file exists with the same name.
10 ab It opens the file in the append mode in binary format. The pointer exists at the end of the previously written file. It creates a new file in binary format if no file exists with the same name.
11 a+ It opens a file to append and read both. The file pointer remains at the end of the file if a file exists. It creates a new file if no file exists with the same name.
12 ab+ It opens a file to append and read both in binary format. The file pointer remains at the end of the file.

让我们看一个简单的示例,以读取模式打开一个名为“ file.txt”的文件(存储在同一目录中),然后在控制台上打印其内容。

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

输出:

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

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语句

with语句是在Python 2.5中引入的。 with语句在处理文件时很有用。在要使用一对代码之间执行一对语句的情况下使用它。

下面给出了用于与该语句一起打开文件的语法。

with open(, ) as :  
    #statement suite   

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

对于文件,总是建议使用with语句,因为如果在嵌套的代码块中发生了中断,返回或异常,则它会自动关闭文件,我们不需要编写close()函数。它不会让文件损坏。

考虑以下示例。

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

写文件

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

w:如果有文件存在,它将覆盖文件。文件指针位于文件的开头。

答:它将追加现有文件。文件指针位于文件末尾。如果不存在文件,它将创建一个新文件。

考虑以下示例。

# 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

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()

输出:

file2.txt的快照

我们可以看到文件的内容已被修改。我们以一种模式打开了文件,并将其内容附加到现有的file2.txt中。

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

下面给出了read()方法的语法。

句法:

fileobj.read()  

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

考虑以下示例。

#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()  

输出:

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

如果我们使用以下行,则它将print文件的所有内容。

content = fileptr.read()
print(content) 

输出:

通过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通过使用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()  

输出:

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

Python还提供了用于读取行的readlines()方法。它返回行列表,直到到达文件末尾(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()  

输出:

创建一个新文件

可以通过使用以下访问模式之一(带有函数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")

输出:

文件指针位置

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

# 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())  

输出:

修改文件指针位置

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

为此, Python向我们提供了seek()方法,使我们能够在外部修改文件指针的位置。

下面给出了使用seek()方法的语法。

句法:

.seek(offset[, from)  

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

offset:它是指文件指针在文件中的新位置。

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())  

输出:

Python OS模块

重命名文件

Python os模块允许与操作系统进行交互。 os模块提供了文件处理操作中涉及的功能,例如重命名,删除等。它为我们提供了named()方法,用于将指定文件重命名为新名称。下面给出了使用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()

输出:

更改当前工作目录

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()

输出:

删除目录

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

下面给出了使用rmdir()方法的语法。

句法

os.rmdir(directory name)  

例子1

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

它将删除指定的目录。

将Python输出写入文件

在Python,要求将Python脚本的输出写入文件。

模块子进程的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 Method Description
1 file.close() It closes the opened file. The file once closed, it can’t be read or write anymore.
2 File.fush() It flushes the internal buffer.
3 File.fileno() It returns the file descriptor used by the underlying implementation to request I/O from the OS.
4 File.isatty() It returns true if the file is connected to a TTY device, otherwise returns false.
5 File.next() It returns the next line from the file.
6 File.read([size]) It reads the file for the specified size.
7 File.readline([size]) It reads one line from the file and places the file pointer to the beginning of the new line.
8 File.readlines([sizehint]) It returns a list containing all the lines of the file. It reads the file until the EOF occurs using readline() function.
9 File.seek(offset[,from) It modifies the position of the file pointer to a specified offset with the specified reference.
10 File.tell() It returns the current position of the file pointer within the file.
11 File.truncate([size]) It truncates the file to the optional specified size.
12 File.write(str) It writes the specified string to a file
13 File.writelines(seq) It writes a sequence of the strings to a file.