Python 读取文件 | 如何在 Python 中打开、读取和写入文件

在使用任何编程语言时,读取和写入文件是一种常见的操作。您可以对代码进行编程以从文件中读取数据或指令,然后再写入数据。这提高了效率并减少了人工。

Python 有一个定义明确的方法来打开、读取和写入文件。Python 中文件操作的一些应用程序包括:读取数据以进行算法训练和测试、读取文件以创建生成艺术、报告和读取配置文件。  

在本教程中,您将学习:

  1. 如何将文件加载到主内存并创建文件句柄。
  2. 如何使用文件句柄打开文件进行读写。
  3. 处理文件时的异常处理。

先决条件:

  • 确保您安装了最新的 Python 版本。
  • 熟悉您选择的任何 Python 支持的文本编辑器。
  • 熟悉基本的 Python 语法。

要快速访问 Python IDE,请查看Replit。你也可以克隆这个repo 并在 Replit 上运行它。

持久性以及如何将文件加载到主内存中

文件驻留在计算机的辅助内存中。辅助内存是持久的,这意味着当计算机断电时数据不会被擦除。对文件进行更改并保存后,更改将永久写入并保存在辅助存储器中。

要处理文件,我们需要先将它们加载到主内存中。主内存是临时缓存内存,用于在短时间内保存请求的数据。计算机断电时数据丢失。

文件从辅助存储器加载到主存储器,然后由 CPU 处理。 处理完成后,数据将被写回辅助存储器。
文件从辅助存储器加载到主存储器,然后由 CPU 处理。处理完成后,数据将被写回辅助存储器。

Python 通过“文件处理程序”与加载到主内存中的文件进行交互。让我们详细看看文件处理程序。

文件处理程序如何工作

当我们要读取或写入文件时,我们必须先打开它。打开文件向操作系统发出信号,以按文件名搜索文件并确保其存在。

如果打开成功,操作系统将返回一个文件处理程序。然后我们可以通过文件处理程序与我们的文件进行交互。

文件处理程序不包含数据本身,它只是提供一个处理文件操作的接口。

文件处理程序使您的程序可以访问辅助存储器中的数据。
文件处理程序使您的程序可以访问辅助存储器中的数据。

如何打开文件

在本例中,我们将打开文件daffodils.txt. 请注意,此文件应存储在与 Python 程序相同的文件夹中。daffodils.txt您可以从此GitHub 链接下载该文件

请看一下该文件,因为我们将在接下来的示例中使用它的内容。

例子:

fhand = open('daffodils.txt')
print(fhand)

fhand在上面的示例中,如果打开成功,操作系统将返回变量中的文件句柄。默认情况下,您只能读取文件。

输出:

图像 177
文件句柄的输出。

在输出中,我们收到了一个文件句柄,其中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) 

输出:

图像 179
打印文件的内容。

我们能够成功访问和打印文件。但是,您是否注意到我们在每行之间出现了额外的空白行?对此有一个解释。让我们在下一节中看到。

如何处理额外的行空间

换行符在 Python 中由 表示n。当放置在字符串中的任何位置时,此字符会添加一个新行。

每行末尾都有一个换行符,用于将输出打印到下一行。我们可以使用该repr方法对其进行可视化。

根据 Python文档,该repr()方法返回一个包含对象可打印表示的字符串。这意味着我们可以看到t or a n出现在字符串中的任何特殊字符,例如 a。  

让我们在下面运行一个示例并查看输出。

图像 180
使用 . 表示字符串repr()

例子:

回到我们的文件,我们可以repr()用来检查特殊字符。

# Get the file handler
fhand = open('daffodils.txt')

# Loop through each line via file handler
for line in fhand:
  print(repr(line)) 

输出:

图像 181
在这里,我们可以看到幕后发生的事情。

此外,print 方法默认添加一个新行。这意味着使用 print,我们将在输出中获得另一个新行。我们可以使用两种方法来处理这个额外的行。

 

方法 #1:更改 print 的默认结束值

下面的代码片段显示了该print函数的参数。我们可以看到默认情况下 的end值为n。这意味着每个打印语句都以n.

图像 22
来源:Python文档

我们可以将默认值更改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")

输出:

图像 182
使用 .在相同和不同的行上打印print()。 

回到我们的主文件,让我们稍微修改一下代码以获得没有额外空行的输出。

# 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 = '')

输出:

在这里,我们得到了我们想要的输出!

使用 print() 打印没有多余的行。
使用print().

方法 #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)

输出:

使用 rstrip() 打印没有多余的行。
使用 rstrip 打印没有额外的行()

如何让用户选择文件

我们可以通过让用户选择文件来使代码动态化,而不是硬编码文件名。

让我们让用户输入一个文件名。然后我们将计算文件中的行数。

例子:

fname = input('Enter the file name: ')
fhand = open(fname)
count = 0
for line in fhand:
     count = count + 1
print('There are', count, 'lines in', fname)
要求用户输入文件名。

输出:

要求用户输入文件名。
要求用户输入文件名。

如何在 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'

异常处理

我们请求的文件可能不存在。由于异常,这会炸毁程序:

图像 189

为了让程序对用户更加友好,我们可以在一个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)

输出:

图像 188
使用 try-except 块处理异常。

包起来

知道如何使用文件是编程中的一个基本概念。在本教程中,您学习了如何使用文件处理程序在 Python 中打开文件以进行读写。

 

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!