Python 读取文件 | 如何在 Python 中打开、读取和写入文件
在使用任何编程语言时,读取和写入文件是一种常见的操作。您可以对代码进行编程以从文件中读取数据或指令,然后再写入数据。这提高了效率并减少了人工。
Python 有一个定义明确的方法来打开、读取和写入文件。Python 中文件操作的一些应用程序包括:读取数据以进行算法训练和测试、读取文件以创建生成艺术、报告和读取配置文件。
在本教程中,您将学习:
- 如何将文件加载到主内存并创建文件句柄。
- 如何使用文件句柄打开文件进行读写。
- 处理文件时的异常处理。
先决条件:
- 确保您安装了最新的 Python 版本。
- 熟悉您选择的任何 Python 支持的文本编辑器。
- 熟悉基本的 Python 语法。
要快速访问 Python IDE,请查看Replit。你也可以克隆这个repo 并在 Replit 上运行它。
持久性以及如何将文件加载到主内存中
文件驻留在计算机的辅助内存中。辅助内存是持久的,这意味着当计算机断电时数据不会被擦除。对文件进行更改并保存后,更改将永久写入并保存在辅助存储器中。
要处理文件,我们需要先将它们加载到主内存中。主内存是临时缓存内存,用于在短时间内保存请求的数据。计算机断电时数据丢失。
Python 通过“文件处理程序”与加载到主内存中的文件进行交互。让我们详细看看文件处理程序。
文件处理程序如何工作
当我们要读取或写入文件时,我们必须先打开它。打开文件向操作系统发出信号,以按文件名搜索文件并确保其存在。
如果打开成功,操作系统将返回一个文件处理程序。然后我们可以通过文件处理程序与我们的文件进行交互。
文件处理程序不包含数据本身,它只是提供一个处理文件操作的接口。
如何打开文件
在本例中,我们将打开文件daffodils.txt
. 请注意,此文件应存储在与 Python 程序相同的文件夹中。daffodils.txt
您可以从此GitHub 链接下载该文件。
请看一下该文件,因为我们将在接下来的示例中使用它的内容。
例子:
fhand = open('daffodils.txt')
print(fhand)
fhand
在上面的示例中,如果打开成功,操作系统将返回变量中的文件句柄。默认情况下,您只能读取文件。
输出:
在输出中,我们收到了一个文件句柄,其中name
是文件名和mode
权限,在我们的例子中是r
(代表read
)。encoding
是 Unicode 字符集的编码机制。您可以在此处了解有关 UTF-8 的更多详细信息。
例外:
如果文件不存在,我们会得到如下异常:
如何打印文件
现在我们有了文件句柄,这意味着我们可以访问该文件。让我们打印文件并查看其内容。
例子:
# Get the file handler
fhand = open('daffodils.txt')
# Loop through each line via file handler
for line in fhand:
print(line)
输出:
我们能够成功访问和打印文件。但是,您是否注意到我们在每行之间出现了额外的空白行?对此有一个解释。让我们在下一节中看到。
如何处理额外的行空间
换行符在 Python 中由 表示n
。当放置在字符串中的任何位置时,此字符会添加一个新行。
每行末尾都有一个换行符,用于将输出打印到下一行。我们可以使用该repr
方法对其进行可视化。
根据 Python文档,该repr()
方法返回一个包含对象可打印表示的字符串。这意味着我们可以看到t or a n
出现在字符串中的任何特殊字符,例如 a。
让我们在下面运行一个示例并查看输出。
例子:
回到我们的文件,我们可以repr()
用来检查特殊字符。
# Get the file handler
fhand = open('daffodils.txt')
# Loop through each line via file handler
for line in fhand:
print(repr(line))
输出:
此外,print 方法默认添加一个新行。这意味着使用 print,我们将在输出中获得另一个新行。我们可以使用两种方法来处理这个额外的行。
方法 #1:更改 print 的默认结束值
下面的代码片段显示了该print
函数的参数。我们可以看到默认情况下 的end
值为n
。这意味着每个打印语句都以n
.
我们可以将默认值更改end='n'
为空白,这样我们就不会在每行末尾换行。让我们看下面的例子来更好地理解。
# By default output would go in separate lines
print("Hello")
print("World")
# Print on the same line because end = ' '
# added single space
print("Hello", end = ' ')
print("World")
输出:
回到我们的主文件,让我们稍微修改一下代码以获得没有额外空行的输出。
# Get the file handler
fhand = open('daffodils.txt')
# Loop through each line and modify the default value of 'end'
for line in fhand:
print(line, end = '')
输出:
在这里,我们得到了我们想要的输出!
方法 #2:使用 rstrip() 方法
strip()
我们可以使用该方法删除字符串周围的某些字符。
现在我们知道,默认情况下,文件中的每一行都有"n"
结尾。由于我们只关心右边的字符,我们将使用rstrip()
which 代表 right-strip。我们将讨论rstrip()
下一个示例。
strip()
您可以在此博客文章中了解有关该方法的更多信息。
# Get the file handler
fhand = open('daffodils.txt')
# Loop through each line and remove extra line character with rstrip()
for line in fhand:
line = line.rstrip()
print(line)
输出:
如何让用户选择文件
我们可以通过让用户选择文件来使代码动态化,而不是硬编码文件名。
让我们让用户输入一个文件名。然后我们将计算文件中的行数。
例子:
输出:
如何在 Python 中编写文件
默认情况下,文件处理程序以读取模式打开文件。如果我们使用以下任何一种模式打开文件,我们就可以写入文件:
w
- (写入)写入现有文件但删除现有内容。a
- (追加)追加到现有文件。x
- (创建)创建一个文件,如果文件存在则返回错误。
如何写入文件
请注意,如果我们尝试使用w
标志打开一个已经存在的文件,则内容将被覆盖。
# Open file with mode 'w'
fout = open('flower.txt', 'w')
fout.write("This content would be added and existing would be discarded")
fout.close()
如何附加到文件
该a
标志附加到现有内容并保留现有内容。
# Open file with mode 'a'
fout = open('flower.txt', 'a')
fout.write("Now the file has more content at the end!")
fout.close()
如何创建文件并写入
该x
模式创建一个文件并向其中添加内容。
# Open file with mode 'x'
fout = open('new-file.txt', 'x')
fout.write("Now the new file has some content!")
fout.close()
如果文件存在,我们会得到如下异常:
Traceback (most recent call last):
File "main.py", line 2, in <module>
fout = open('flower.txt', 'x')
FileExistsError: [Errno 17] File exists: 'flower.txt'
异常处理
我们请求的文件可能不存在。由于异常,这会炸毁程序:
为了让程序对用户更加友好,我们可以在一个try-except
块中处理这个异常。
程序中预期会崩溃的风险部分写在一个try
块中。如果代码无异常执行,except
则跳过该块并继续运行程序。如果发现异常,该块将使用命令except
优雅地运行并关闭程序。exit
fname = input('Enter the file name: ')
try:
fhand = open(fname)
except:
print('File nout found and can not be opened:', fname)
exit()
count=0
for line in fhand:
count = count + 1
print('There are', count, 'lines in', fname)
输出:
包起来
知道如何使用文件是编程中的一个基本概念。在本教程中,您学习了如何使用文件处理程序在 Python 中打开文件以进行读写。