📅  最后修改于: 2020-10-24 09:16:56             🧑  作者: Mango
到目前为止,我们一直在从控制台获取输入,并将其写回到控制台以与用户进行交互。
有时仅在控制台上显示数据是不够的。要显示的数据可能非常大,并且由于内存易失,因此只能在控制台上显示有限数量的数据,因此无法一次又一次地恢复以编程方式生成的数据。
当数据需要永久存储到文件中时,文件处理起着重要作用。文件是磁盘上用于存储相关信息的命名位置。程序终止后,我们可以访问存储的信息(非易失性)。
在其他编程语言中,文件处理实现有些冗长或复杂,但在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()方法通过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(, ) 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()函数将内容写入了文件。
#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循环读取文件。考虑以下示例。
#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”的第一行。考虑以下示例。
#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)。
#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:如果不存在指定名称的文件,它将创建一个新文件。它将覆盖现有文件。
考虑以下示例。
#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模块允许与操作系统进行交互。 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()方法的语法。
句法
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脚本的输出写入文件。
模块子进程的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. |