Python 30 天 – 第 18 天 – 文件 I/O(Python 处理文件)
本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接
- Python 30 天 – 第一天 – 简介
- Python 30 天 – 第 2 天 – 数据类型 I
- Python 30 天 – 第 3 天 – 数据类型 II
- Python 30 天 – 第 4 天 – 数据类型 III
- Python 30 天 – 第 5 天 – 条件和循环 I
- Python 30 天 – 第 6 天 – 循环 II 和函数
- Python 30 天 – 第 7 天 – 开发者环境
- Python 30 天 – 第 8 天 – OOP 基础知识
- Python 30 天 – 第 9 天 – OOP 支柱
- Python 30 天 – 第 10 天 – OOP 丢失的碎片
- Python 30 天 – 第 11 天 – 函数式编程
- Python 30 天 – 第 12 天 – Lambda 表达式和理解
- Python 30 天 – 第 13 天 – 装饰器
- Python 30 天 – 第 14 天 – 处理错误
- Python 30 天 – 第 15 天 – 生成器
- Python 30 天 – 第 16 天 – 模块基础
- Python 30 天 – 第 17 天 – 外部模块
今天我探索了如何使用 Python 处理文件和与文件通信。这些天来,我一直在探索和分享各种 Python 概念以及一些在 Python 中编程的最佳实践。但是,我们还没有与 Python 之外的外部世界进行过交互。我们的程序经常因为各种原因需要与外部世界进行通信,例如从 excel、CSV 或 pdf 文件中读取数据,转换和压缩图像,从文本文件中提取数据,从数据库中读取数据等等。这种与外部世界的交互是通过 I/O 或输入输出操作完成的。
文件帮助我们将数据永久存储到系统中。当我们编写任何程序来管理某些数据时,这些数据会暂时存储在机器的 RAM 中,并在计算机关闭时被删除。要永久存储数据,它们需要存储在某种数据库或某些文件系统中,以便以后可以访问。
文件可以根据其内容大致分为两种类型,
- 二进制(也称为富文本)
- 文本
Python 提供了一个内置函数 open 来打开任何文件。首先需要打开任何文件以从中读取数据或向其写入一些数据。在 Python 中从文件中读取数据很简单。
我使用REPL来试验本文提供的所有代码块。
打开文件
我创建了一个 test.txt 文件,其中包含一些用于测试的虚拟内容。
test.txt
# test.txt I am learning python.
现在可以像这样使用 Python 读取该文件的内容。
main.py
content = open('test.txt')
output = content.read()
print(output) # I am learning python.
我们还可以在 open 函数中指定打开文件时的模式。默认情况下,模式为“r”或读取模式。我们还可以指定文件是否需要以文本或二进制模式打开。
模式 | 描述 |
---|---|
r | 打开一个文件进行读取。(默认) |
W | 打开一个文件进行写入。如果不存在则创建新文件,如果存在则截断文件。 |
X | 打开一个文件以进行独占创建。如果文件已存在,则操作失败。 |
a | 打开文件以追加到文件末尾而不截断它。如果它不存在,则创建一个新文件。 |
t | 以文本模式打开。(默认) |
b | 以二进制模式打开。 |
+ | 打开一个文件进行更新(读取和写入) |
我们还可以在打开文件时指定编码格式。默认格式为 utf-8
关闭文件
在对文件执行操作后关闭文件很重要,因为它会释放与文件相关的内存空间。
main.py
content = open('test.txt', mode='r')
output = content.read()
print(output)
content.close()
上面的块可以放在 try-except finally 块中。这确保如果在执行操作时出现任何错误,文件将被关闭。
try:
content = open('test.txt', mode='r')
output = content.read()
print(output)
except FileNotFoundError as error:
print(f'file not found {error}')
finally:
content.close()
Python 提供了一种更好的语法来使用 with语句打开对文件的执行操作。执行操作后,它会自动关闭文件。
main.py
with open('test.txt', mode='r') as content:
output = content.read()
print(output) # I am learning python.
写入文件
Python 提供了 write 方法将数据写入文件。该文件需要使用 w 模式打开才能写入文件。需要注意的是,使用 w 模式会覆盖文件的内容。如果需要追加内容,则可以使用a方式。如果该文件不存在,则会在向其写入数据之前创建该文件。
main.py
with open('test.txt', mode='w', encoding='utf-8') as my_file:
my_file.write('This is the first line\n') # \n is for creating a newline
my_file.write('This is the second line\n')
my_file.write('This is the third line')
main.py
with open('test.txt', mode='a', encoding='utf-8') as my_file:
my_file.write('This text will be appended')
另一种写入方式是使用 writelines 方法。它可以提供一个项目列表。
main.py
with open('test.txt', mode='w', encoding='utf-8') as my_file:
my_file.writelines(['First line', '\n', 'Second Line'])
从文件中读取
Python 提供了很多方法来读取文件。该文件需要使用“r”模式打开。如果我们必须一起进行读写操作,这也是一种“r+”模式。read 方法接受一个大小参数,它基本上是它将读取的字符数。如果未提供大小,则读取整个文件。
main.py
with open('test.txt', mode='r', encoding='utf-8') as my_file:
content = my_file.read()
print(content)
有一个 tell 方法可以提供当前正在读取的文件中的光标所在的位置。
seek 方法用于将光标带到文件中的特定位置。
main.py
with open('test.txt', mode='r', encoding='utf-8') as my_file:
my_file.seek(0) # brings cursor to beginning of file
print(my_file.tell()) # prints location of cursor
content = my_file.read()
print(content)
如果文件中有很多行,更有效和高效的方法是使用循环读取行。
main.py
with open('test.txt', mode='r', encoding='utf-8') as my_file:
for line in my_file:
print(line)
或者,Python 提供了另外两种方法,readline和readlines。
readline 读取文件,直到到达换行符 (\n)。
Readlines 返回一个行列表。
Python文件方法
这是 Python 中可用的文件方法的完整列表
方法 | 描述 |
---|---|
close() | 关闭打开的文件。如果文件已经关闭,则无效。 |
detach() | 将底层二进制缓冲区与 TextIOBase 分开并返回。 |
fileno() | 返回文件的整数(文件描述符)。 |
flush() | 刷新文件流的写入缓冲区。 |
isatty() | 如果文件流是交互式的,则返回 True。 |
read(n) | 从文件中最多读取 n 个字符。如果为负数或无,则读取到文件末尾。 |
readable() | 如果可以读取文件流,则返回 True。 |
readline(n=-1) | 从文件中读取并返回一行。如果指定,最多读取 n 个字节。 |
readlines(n=-1) | 从文件中读取并返回行列表。如果指定,最多读取 n 个字节/字符。 |
seek(offset,from=SEEK_SET) | 将文件位置更改为偏移字节,参考 from (start, current, end)。 |
seekable() | 如果文件流支持随机访问,则返回 True。 |
tell() | 返回当前文件位置。 |
truncate(size=None) | 将文件流调整为 size 字节。如果未指定大小,则调整到当前位置。 |
writable() | 如果可以写入文件流,则返回 True。 |
write(s) | 将字符串 s 写入文件并返回写入的字符数。 |
writelines(lines) | 将行列表写入文件。 |
实例
让我们尝试构建一个翻译程序,该程序可以读取包含英文内容的文件,并以不同语言创建该文件的新翻译版本。
在本练习中,我们将使用来自 PyPI 的名为Translate的外部 Python 包。借助这个包,我们可以进行离线翻译!
首先,需要安装这个包。由于我使用的是 REPL,因此我会将其添加到 REPL 中的包部分。如果使用本地项目,则可以在终端中使用 pip 安装它。
将创建一个名为 quote.txt 的文件,
quote.txt
If you can't make it good, at least make it look good. - Bill Gates
现在让我们生成这句话的两个翻译版本。一个是西班牙语,文件名为quote-es.txt,另一个是法语,文件名为quote-fr.txt
main.py
from translate import Translator
spanish_translate = Translator(to_lang="es")
french_translate = Translator(to_lang="fr")
try:
with open('quote.txt', mode='r') as quote_file:
# read the file
quote = quote_file.read()
# do the translations
quote_spanish = spanish_translate.translate(quote)
quote_french = french_translate.translate(quote)
# create the translated files
try:
with open('quote-es.txt', mode='w') as quote_de:
quote_de.write(quote_spanish)
with open('quote-fr.txt', mode='w') as quote_fr:
quote_fr.write(quote_french)
except IOError as error:
print('An error ocurred')
raise (error)
except FileNotFoundError as error:
print('File not found')
raise (error)
这将生成两个翻译文件,其中引用自动翻译。那太酷了!
内置模块来处理文件
Python 提供了一个内置模块作为其标准库的一部分,称为 pathlib。它提供了各种方便的类来表示具有适用于不同操作系统的语义的文件系统路径。这个模块是在 v3.4 中引入的。在处理大量目录时使用此包是有益的。
这就是今天的全部内容。明天我计划探索在 Python 中使用正则表达式及其用例。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!