当前位置:

首页 > 编程开发 > 一文搞定Python读取文件的全部知识

一文搞定Python读取文件的全部知识

文件是无处不在的,无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可少的文件处理是一种用于创建文件、写入数据和从中读取数据的过程,Python拥有丰富的用于处理不同文件类型的包,从而使得我们可以更加轻松方便的完成文件处理的工作本文大纲:使用上下文管理器打开文件Python中的文件读取模式读取text文件读取CSV文件读取JSON文件打开文件在访问文件的内容之前,我们需要打开文件。Python提供了一个内置函数可以帮助我们以不同的模式打开文件。open()函数接受两个基本参数:文

一文搞定Python读取文件的全部知识

文件是无处不在的,无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可少的

文件处理是一种用于创建文件、写入数据和从中读取数据的过程,Python 拥有丰富的用于处理不同文件类型的包,从而使得我们可以更加轻松方便的完成文件处理的工作

本文大纲:

  • 使用上下文管理器打开文件
  • Python 中的文件读取模式
  • 读取 text 文件
  • 读取 CSV 文件
  • 读取 JSON 文件

打开文件

在访问文件的内容之前,我们需要打开文件。Python 提供了一个内置函数可以帮助我们以不同的模式打开文件。open() 函数接受两个基本参数:文件名和模式

默认模式是“r”,它以只读方式打开文件。这些模式定义了我们如何访问文件以及我们如何操作其内容。open() 函数提供了几种不同的模式,我们将在后面逐一讨论

下面我们通过 ’Python 之禅‘ 文件来进行后面的讨论学习

f = open('zen_of_python.txt', 'r')
print(f.read())
f.close()

Output:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
...

在上面的代码中,open() 函数以只读模式打开文本文件,这允许我们从文件中获取信息而不能更改它。在第一行,open() 函数的输出被赋值给一个代表文本文件的对象 f,在第二行中,我们使用 read() 方法读取整个文件并打印其内容,close() 方法在最后一行关闭文件。需要注意,我们必须始终在处理完打开的文件后关闭它们以释放我们的计算机资源并避免引发异常

在 Python 中,我们可以使用 with 上下文管理器来确保程序在文件关闭后释放使用的资源,即使发生异常也是如此

with open('zen_of_python.txt') as f:
 print(f.read())

Output:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
...

上面的代码使用 with 语句创建了一个上下文,并绑定到变量 f ,所有文件对象方法都可以通过该变量访问文件对象。read() 方法在第二行读取整个文件,然后使用 print() 函数输出文件内容

当程序到达 with 语句块上下文的末尾时,它会关闭文件以释放资源并确保其他程序可以正常调用它们。通常当我们处理不再需要使用的,需要立即关闭的对象(例如文件、数据库和网络连接)时,强烈推荐使用 with 语句

这里需要注意的是,即使在退出 with 上下文管理器块之后,我们也可以访问 f 变量,但是该文件是已关闭状态。让我们尝试一些文件对象属性,看看变量是否仍然存在并且可以访问:

print("Filename is '{}'.".format(f.name))
if f.closed:
 print("File is closed.")
else:
 print("File isn't closed.")

Output:

Filename is 'zen_of_python.txt'.
File is closed.

但是此时是不可能从文件中读取内容或写入文件的,关闭文件时,任何访问其内容的尝试都会导致以下错误:

f.read()

Output:

---------------------------------------------------------------------------
ValueErrorTraceback (most recent call last)
~AppDataLocalTemp/ipykernel_9828/3059900045.py in 
----> 1 f.read()
ValueError: I/O operation on closed file.

Python 中的文件读取模式

正如我们在前面提到的,我们需要在打开文件时指定模式。下表是 Python 中的不同的文件模式:

模式说明

  • 'r' 打开一个只读文件
  • 'w' 打开一个文件进行写入。如果文件存在,会覆盖它,否则会创建一个新文件
  • 'a' 打开一个仅用于追加的文件。如果该文件不存在,会创建该文件
  • 'x' 创建一个新文件。如果文件存在,则失败
  • '+' 打开一个文件进行更新

我们还可以指定以文本模式“t”、默认模式或二进制模式“b”打开文件。让我们看看如何使用简单的语句复制图像文件 dataquest_logo.png:

with open('dataquest_logo.png', 'rb') as rf:
 with open('data_quest_logo_copy.png', 'wb') as wf:
 for b in rf:
 wf.write(b)

上面的代码复制 Dataquest 徽标图像并将其存储在同一路径中。'rb' 模式以二进制模式打开文件并进行读取,而 'wb' 模式以文本模式打开文件以并行写入

读取文本文件

在 Python 中有多种读取文本文件的方法,下面我们介绍一些读取文本文件内容的有用方法

到目前为止,我们已经了解到可以使用 read() 方法读取文件的全部内容。如果我们只想从文本文件中读取几个字节怎么办,可以在 read() 方法中指定字节数。让我们尝试一下:

with open('zen_of_python.txt') as f:
 print(f.read(17))

Output:

The Zen of Python

上面的简单代码读取 zen_of_python.txt 文件的前 17 个字节并将它们打印出来

有时一次读取一行文本文件的内容更有意义,在这种情况下,我们可以使用 readline() 方法

with open('zen_of_python.txt') as f:
 print(f.readline())

Output:

The Zen of Python, by Tim Peters

上面的代码返回文件的第一行,如果我们再次调用该方法,它将返回文件中的第二行等,如下:

with open('zen_of_python.txt') as f:
 print(f.readline())
 print(f.readline())
 print(f.readline())
 print(f.readline())

Output:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.

这种有用的方法可以帮助我们以增量方式读取整个文件。

以下代码通过逐行迭代来输出整个文件,直到跟踪我们正在读取或写入文件的位置的文件指针到达文件末尾。当 readline() 方法到达文件末尾时,它返回一个空字符串

with open('zen_of_python.txt') as f:
 line = f.readline()
 while line:
 print(line, end='')
 line = f.readline()

Output:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

上面的代码在 while 循环之外读取文件的第一行并将其分配给 line 变量。在 while 循环中,它打印存储在 line 变量中的字符串,然后读取文件的下一行。while 循环迭代该过程,直到 readline() 方法返回一个空字符串。空字符串在 while 循环中的计算结果为 False,因此迭代过程终止

读取文本文件的另一个有用方法是 readlines() 方法,将此方法应用于文件对象会返回包含文件每一行的字符串列表

with open('zen_of_python.txt') as f:
 lines = f.readlines()

让我们检查 lines 变量的数据类型,然后打印它:

print(type(lines))
print(lines)

Output:


['The Zen of Python, by Tim Petersn', 'n', 'Beaut...]

它是一个字符串列表,其中列表中的每个项目都是文本文件的一行,``n` 转义字符表示文件中的新行。此外,我们可以通过索引或切片操作访问列表中的每个项目:

print(lines)
print(lines[3:5])
print(lines[-1])

Output:

['The Zen of Python, by Tim Petersn', 'n', 'Beautiful is better than ugly.n', ... -- let's do more of those!"]
['Explicit is better than implicit.n', 'Simple is better than complex.n']
Namespaces are one honking great idea -- let's do more of those!

读取 CSV 文件

到目前为止,我们已经学会了如何使用常规文本文件。但是有时数据采用 CSV 格式,数据专业人员通常会检索所需信息并操作 CSV 文件的内容

接下来我们将使用 CSV 模块,CSV 模块提供了有用的方法来读取存储在 CSV 文件中的逗号分隔值。我们现在就尝试一下

import csv
with open('chocolate.csv') as f:
 reader = csv.reader(f, delimiter=',')
 for row in reader:
 print(row)

Output:

['Company', 'Bean Origin or Bar Name', 'REF', 'Review Date', 'Cocoa Percent', 'Company Location', 'Rating', 'Bean Type', 'Country of Origin']
['A. Morin', 'Agua Grande', '1876', '2016', '63%', 'France', '3.75', 'Âxa0', 'Sao Tome']
['A. Morin', 'Kpime', '1676', '2015', '70%', 'France', '2.75', 'Âxa0', 'Togo']
['A. Morin', 'Atsane', '1676', '2015', '70%', 'France', '3', 'Âxa0', 'Togo']
['A. Morin', 'Akata', '1680', '2015', '70%', 'France', '3.5', 'Âxa0', 'Togo']
...

CSV 文件的每一行形成一个列表,其中每个项目都可以轻松的被访问,如下所示:

import csv
with open('chocolate.csv') as f:
 reader = csv.reader(f, delimiter=',')
 for row in reader:
 print("The {} company is located in {}.".format(row[0], row[5]))

Output:

The Company company is located in Company Location.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The Acalli company is located in U.S.A..
The Acalli company is located in U.S.A..
The Adi company is located in Fiji.
...

很多时候,使用列的名称而不是使用它们的索引,这通常对专业人员来说更方便。在这种情况下,我们不使用 reader() 方法,而是使用返回字典对象集合的 DictReader() 方法

import csv
with open('chocolate.csv') as f:
 dict_reader = csv.DictReader(f, delimiter=',')
 for row in dict_reader:
 print("The {} company is located in {}.".format(row['Company'], row['Company Location']))

Output:

The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The A. Morin company is located in France.
The Acalli company is located in U.S.A..
The Acalli company is located in U.S.A..
The Adi company is located in Fiji.
...

读取 JSON 文件

我们主要用于存储和交换数据的另一种流行文件格式是 JSON,JSON 代表 JavaScript Object Notation,允许我们使用逗号分隔的键值对存储数据

接下来我们将加载一个 JSON 文件并将其作为 JSON 对象使用,而不是作为文本文件,为此我们需要导入 JSON 模块。然后在 with 上下文管理器中,我们使用了属于 json 对象的 load() 方法,它加载文件的内容并将其作为字典存储在上下文变量中。

import json
with open('movie.json') as f:
 content = json.load(f)
 print(content)

Output:

{'Title': 'Bicentennial Man', 'Release Date': 'Dec 17 1999', 'MPAA Rating': 'PG', 'Running Time min': 132, 'Distributor': 'Walt Disney Pictures', 'Source': 'Based on Book/Short Story', 'Major Genre': 'Drama', 'Creative Type': 'Science Fiction', 'Director': 'Chris Columbus', 'Rotten Tomatoes Rating': 38, 'IMDB Rating': 6.4, 'IMDB Votes': 28827}

让我们检查内容变量的数据类型:

print(type(content))

Output:

它的数据类型是字典,因此我们可以方便的从中提取数据

print('{} directed by {}'.format(content['Title'], content['Director']))

Output:

Bicentennial Man directed by Chris Columbus

总结

今天我们讨论了 Python 中的文件处理,重点是读取文件的内容。我们了解了 open() 内置函数、with 上下文管理器,以及如何读取文本、CSV 和 JSON 等常见文件类型。

好了,这就是今天分享的全部内容,喜欢就点个赞吧~

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
Python安装后怎么打开:使用IDLE或命令行启动解释器
Python安装后怎么打开:使用IDLE或命令行启动解释器

刚在Windows安装好Python却不知道如何启动?本文详细演示如何通过开始菜单找到并打开IDLE集成开发环境,以及如何在PowerShell或命令提示符中使用python和py命令启动交互式解释器、运行.py脚本文件。包含退出解释器的方法及常见启动问题排查,帮助初学者快速验证安装成功并开始编写代码。

Windows系统Python安装教程:下载、勾选PATH及环境变量配置
Windows系统Python安装教程:下载、勾选PATH及环境变量配置

针对Windows初学者的Python安装实战指南。详细讲解如何从Python官网下载匹配架构的安装包,重点演示安装首屏勾选“Add python.exe to PATH”的关键操作,并提供使用python --version和py命令验证环境变量的具体步骤,帮助新手快速搭建开发环境并排查路径问题。

麒麟OS如何查看Python进程的运行状态
麒麟OS如何查看Python进程的运行状态

要想确认麒麟OS中Python程序的运行状态以及资源占用情况,我们可以这样做:用ps -ef | grep python来筛选进程;通过top命令,按P键排序查看实时负载;使用pgrep -f "script.py"精准获取PID;借助lsof -p PID验证文件打开状态。另外,还可以结合syst

Python在Debian上如何配置SSL证书
Python在Debian上如何配置SSL证书

在Debian系统上配置SSL证书通常涉及以下几个步骤:安装Web服务器:首先,你需要一个Web服务器,比如Apache或Nginx。这里以Apache为例。sudo apt updatesudo apt install apache2获取SSL证书:你可以从Let’s Encrypt免费获取SSL

统信UOS怎么安装Python开发环境
统信UOS怎么安装Python开发环境

要想让Python项目在统信UOS上正常运行,得先安装python3、python3-pip、python3-venv、python3-dev以及build-essential等组件。具体操作就是执行sudo apt install命令来一步到位完成安装,同时别忘了配置清华镜像源来给pip加速哦。在

纯Python方案实现中英文全文搜索
纯Python方案实现中英文全文搜索

在互联网上的各类网站中,无论大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。从简单的来说,搜索功能确实很简单,一个简单的select语句就可以实现数据的搜索。而从复杂的来看,无论是搜索的精度还是搜索的效率,都是有很深的研究范围的。对于简单的搜索功能来说,一个s

Mac如何取消通过Python脚本运行的关机程序
Mac如何取消通过Python脚本运行的关机程序

立即在终端输入sudo shutdown -c取消倒计时关机,成功后显示“Shutdown cancelled”;若存在pmset重复任务,需再执行sudo pmset repeat cancel清除。Mac因Python脚本执行了os.system("sudo shutdown -h +10")或

Pythonasyncio异步并发与多固定出口IP调度实战
Pythonasyncio异步并发与多固定出口IP调度实战

之前写过一篇同步场景下用 Python 管理多个固定出口 IP 的实践(ExitPool + requests/httpx),覆盖了健康检查、故障转移和连接池复用。但在实际业务中,越来越多的场景用 asyncio 做高并发采集或批量接口调用——异步事件循环下多出口的管理方式和同步场景完全不同:单线程

Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换
Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换

写在前面:为什么静态出口 IP 不是"买了就行"不少团队在引入静态出口 IP 产品时,第一反应往往是:“地址配上去,这事就算完了。”可真到了真实业务里,静态出口 IP 真正能体现价值的地方,往往不在分配这一步,而在分配之后怎么管:地址有没有漂移,质量是否达标,某一条线路突然不可用时怎么切换,连接层又

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。