直到现在,我们从控制台获取输入并将其写回控制台以与用户交互。
有时,仅在控制台上显示数据是不够的。要显示的数据可能非常大,并且只能在控制台上显示有限数量的数据,并且由于存储器是易失性的,因此不可能一次又一次地恢复编程生成的数据。
但是,如果我们需要这样做,我们可以将它存储到本地文件系统中,该文件系统是易失性的,并且每次都可以访问。这里需要文件处理。
在本教程的这一部分中,我们将学习python中的所有文件处理,包括创建文件,打开文件,关闭文件,编写和附加文件等。
打开文件
Python提供了open()函数,它接受两个参数,文件名和访问文件的访问模式。该函数返回一个文件对象,可用于执行各种操作,如读,写等。
下面给出了使用open()函数的语法。
file object = open(<file-name>, <access-mode>, <buffering>)
可以使用各种模式(如读取,写入或追加)访问这些文件。以下是有关打开文件的访问模式的详细信息。
SN | 访问模式 | 描述 |
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")
Output:
<class '_io.TextIOWrapper'> file is opened successfully
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()
读取文件
要使用python脚本读取文件,python为我们提供了read()方法。read()方法从文件中读取一个字符串。它可以读取文本中的数据以及二进制格式。
read()方法的语法如下。
fileobj.read(<count>)
这里,count是从文件开头开始从文件中读取的字节数。如果未指定计数,则它可以读取文件的内容直到结束。
请考虑以下示例。
例
#open the file.txt in read mode. causes error if no such file exists. fileptr = open("file.txt","r"); #stores all the data of the file into the variable content content = fileptr.read(9); # 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()
Output:
<class 'str'> Hi, I am
读取文件的行
Python使我们能够使用函数readline()逐行读取文件。readline()方法从头开始读取文件的行,即,如果我们使用readline()方法两次,那么我们可以得到文件的前两行。
请考虑以下示例,其中包含函数readline(),该函数读取包含三行的文件“file.txt”的第一行。
例
#open the file.txt in read mode. causes error if no such file exists. fileptr = open("file.txt","r"); #stores all the data of the file into the variable content content = fileptr.readline(); # 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()
Output:
<class 'str'> Hi, I am the file and being used as
循环遍历文件
通过循环遍历文件的行,我们可以读取整个文件。
例
#open the file.txt in read mode. causes an error if no such file exists. fileptr = open("file.txt","r"); #running a for loop for i in fileptr: print(i) # i contains each line of the file
Output:
Hi, I am the file and being used as an example to read a file in python.
写文件
要将某些文本写入文件,我们需要使用以下访问模式之一的open方法打开该文件。
a:它将附加现有文件。文件指针位于文件的末尾。如果不存在文件,它会创建一个新文件。
w:如果存在任何文件,它将覆盖该文件。文件指针位于文件的开头。
请考虑以下示例。
例1
#open the file.txt in append mode. Creates a new file if no such file exists. fileptr = open("file.txt","a"); #appending the content to the file fileptr.write("Python is the modern day language. It makes things so simple.") #closing the opened file fileptr.close();
现在,我们可以看到文件的内容被修改。
FILE.TXT:
Hi, I am the file and being used as an example to read a file in python. Python is the modern day language. It makes things so simple.
例2
#open the file.txt in write mode. fileptr = open("file.txt","w"); #overwriting the content of the file fileptr.write("Python is the modern day language. It makes things so simple.") #closing the opened file fileptr.close();
现在,我们可以检查文件的所有先前编写的内容是否都被我们传递的新文本覆盖。
FILE.TXT:
Python is the modern day language. It makes things so simple.
创建一个新文件
可以使用以下访问模式之一使用open()函数创建新文件。 x:它创建一个具有指定名称的新文件。它会导致文件存在同名错误。
a:如果不存在这样的文件,它会创建一个具有指定名称的新文件。如果文件已存在且具有指定名称,则会将内容附加到文件。
w:如果不存在这样的文件,它会创建一个具有指定名称的新文件。它会覆盖现有文件。
请考虑以下示例。
例
#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");
Output:
File created successfully
与文件一起使用with语句
with语句是在python 2.5中引入的。在处理文件的情况下,with语句很有用。with语句用于要使用其间的代码块执行一对语句的场景。
下面给出了使用with语句打开文件的语法。
with open(<file name>, <access mode>) as <file-pointer>: #statement suite
使用with语句的优点是它提供了关闭文件的保证,无论嵌套块如何退出。
在文件s的情况下使用with语句总是可以建议的,因为如果在嵌套的代码块中发生中断,返回或异常,则它会自动关闭文件。它不会让文件被破坏。
请考虑以下示例。
例
with open("file.txt",'r') as f: content = f.read(); print(content)
Output:
Python is the modern day language. It makes things so simple.
文件指针位置
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())
Output:
The filepointer is at byte : 0 After reading, the filepointer is at 26
修改文件指针位置
在现实世界的应用程序中,有时我们需要在外部更改文件指针位置,因为我们可能需要在不同位置读取或写入内容。
为此,python为我们提供了seek()方法,使我们能够在外部修改文件指针位置。
下面给出了使用seek()方法的语法。
<file-ptr> .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()) #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 26
Python os模块
os模块为我们提供了文件处理操作中涉及的功能,如重命名,删除等。
我们来看一些os模块函数。
重命名文件
os模块为我们提供了rename()方法,该方法用于将指定文件重命名为新名称。下面给出了使用rename()方法的语法。
rename(?current-name?, ?new-name?)
例
import os; #rename file2.txt to file3.txt os.rename("file2.txt","file3.txt")
删除文件
os模块为我们提供了remove()方法,用于删除指定的文件。下面给出了使用remove()方法的语法。
remove(?file-name?)
例
import os; #deleting the file named file3.txt os.remove("file3.txt")
创建新目录
mkdir()方法用于在当前工作目录中创建目录。下面给出了创建新目录的语法。
mkdir(?directory name?)
例
import os; #creating a new directory with the name new os.mkdir("new")
更改当前工作目录
chdir()方法用于将当前工作目录更改为指定目录。
下面给出了使用chdir()方法的语法。
chdir("new-directory")
例
import os; #changing the current working directory to new os.chdir("new")
getcwd()方法
此方法返回当前工作目录。
下面给出了使用getcwd()方法的语法。
os.getcwd()
例
import os; #printing the current working directory print(os.getcwd())
删除目录
rmdir()方法用于删除指定的目录。
下面给出了使用rmdir()方法的语法。
os.rmdir(?directory name?)
例
import os; #removing the new directory os.rmdir("new")
将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)
输出:
50 -4 That temperature doesn't make sense! 212
文件相关的方法
文件对象提供以下方法来操作各种操作系统上的文件。
SN | 方法 | 描述 |
1 | file.close() | 它会关闭打开的文件。文件一旦关闭,就不能再读或写了。 |
2 | File.fush() | 它刷新内部缓冲区。 |
3 | File.fileno() | 它返回底层实现使用的文件描述符,以从OS请求I / O. |
4 | File.isatty() | 如果文件连接到TTY设备,则返回true,否则返回false。 |
5 | File.next() | 它返回文件中的下一行。 |
6 | File.read([大小]) | 它读取指定大小的文件。 |
7 | File.readline([大小]) | 它从文件中读取一行,并将文件指针放在新行的开头。 |
8 | File.readlines([sizehint]) | 它返回一个包含文件所有行的列表。它使用readline()函数读取文件直到EOF发生。 |
9 | File.seek(偏移[,从) | 它使用指定的引用将文件指针的位置修改为指定的偏移量。 |
10 | File.tell() | 它返回文件中文件指针的当前位置。 |
11 | File.truncate([大小]) | 它将文件截断为可选的指定大小。 |
12 | File.write(STR) | 它将指定的字符串写入文件 |
13 | File.writelines(SEQ) | 它将一串字符串写入文件。 |