如何在 Python 3 中处理纯文本文件

简介

Python 是一个处理数据的强大工具。编程中最常见的任务之一就是读取、写入或操作数据。因此,了解如何处理存储不同类型数据的不同文件格式尤为重要。

例如,考虑一个检查用户访问控制列表的 Python 程序。你的用户列表可能存储在一个文本文件中,允许你检查访问权限或修改权限。使用 Python,能够打开、读取、写入和关闭文件将有助于处理此类任务。

本教程将简要描述 Python 能够处理的一些文件格式。在简要介绍这些文件格式之后,你将学习如何在 Python 3 中打开、读取和写入文本文件。完成后,你将能够处理 Python 中的任何纯文本文件。

先决条件

在进行本教程之前,你应该已经安装了 Python 3,并在计算机上设置了本地编程环境。如果还没有这样做,你可以按照适用于你操作系统的相应安装和设置指南进行设置:

  • Ubuntu 22.04 或 Debian 8
  • CentOS 7
  • Mac OS X
  • Windows 10

背景

Python 非常灵活,可以轻松处理多种不同的文件格式,包括但不限于以下内容:

文件类型描述
纯文本纯文本文件存储表示仅包含字符(或字符串)的数据,并排除任何结构化元数据
CSV逗号分隔值文件使用逗号(或其他分隔符)来结构化存储的数据,允许数据以表格格式保存
HTML超文本标记语言文件存储用于由浏览器显示的结构化数据,通常与网站一起使用
JSONJavaScript 对象表示法是一种简单高效的格式,使其成为存储和传输结构化数据最常用的格式之一

本教程将重点介绍如何处理纯文本文件。

步骤 1 —— 创建文本文件

在我们开始在 Python 中工作之前,我们需要确保有一个要处理的文件。为此,请打开你的代码编辑器,并创建一个名为 days.txt 的新纯文本文件。

在新文件中,输入几行文本,列出一周的天数:

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

接下来,保存你的文件,并记下其位置。在本例中,我们的用户 sammy 将文件保存在 /home/sammy/days.txt。这在后续步骤中将非常重要,因为我们将在 Python 中打开该文件。

现在你已经有了要处理的文件,可以开始编写代码了。

步骤 2 —— 打开文件

在你的代码编辑器中,创建一个新的 Python 文件,并将其命名为 files.py

要在 Python 中打开一个文件,我们首先需要一种将磁盘上的文件与 Python 中的变量关联的方法。这个过程称为打开文件,而变量称为文件句柄。我们首先告诉 Python 文件的位置。文件的位置通常被称为文件路径 —— 在本例中是 /home/sammy/days.txt。创建一个变量来存储这个路径信息。

path = '/home/sammy/days.txt'

现在,你可以使用 Python 的 open() 函数来打开我们的 days.txt 文件。open() 函数需要文件路径作为其第一个参数。该函数还接受许多其他参数。然而,最重要的是可选的 mode 参数。这是一个可选的字符串,指定打开文件的模式。你选择的模式将取决于你希望对文件进行的操作。以下是一些可用的模式:

  • 'r':用于从文件中读取数据
  • 'w':用于向文件中写入数据
  • 'a':用于向文件中追加数据
  • 'r+':用于在同一文件中进行读取和写入

在本例中,我们只想从文件中读取数据,因此我们将使用 'r' 模式。使用 open() 函数打开 days.txt 文件,并将生成的文件句柄分配给变量 days_file

days_file = open(path, 'r')

现在你已经打开了文件,接下来的步骤将指导你读取其内容。

步骤 3 —— 读取文件

由于我们已经打开了文件,现在可以通过分配给它的变量来操作它(即从中读取)。Python 提供了三种相关的操作来从文件中读取信息。让我们花点时间了解一下它们各自是如何工作的。

使用 read

第一个操作 read() 返回整个文件的内容作为一个字符串。例如:

days_file.read()

结果将是:

'Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday\n'

使用 readline

第二个操作 readline() 返回文件的下一行,包括下一个换行符在内的文本。简单来说,这个操作将逐行读取文件。

days_file.readline()

结果将是:

'Monday\n'

一旦使用 readline 操作读取了一行,文件的当前读取位置将移动到下一行。如果再次调用这个操作,它将返回文件中的下一行,如下所示:

days_file.readline()
'Tuesday\n'

使用 readlines

最后一个操作 readlines() 返回文件中每一行的列表,其中列表的每个项目代表一行。

days_file.readlines()
['Monday\n', 'Tuesday\n', 'Wednesday\n', 'Thursday\n', 'Friday\n', 'Saturday\n', 'Sunday\n']

在读取文件时需要记住的一点是,一旦使用了其中一个读取操作,就不能再次读取文件。例如,如果首先运行 days_file.read(),然后是 days_file.readlines(),第二个操作将返回一个空字符串。因此,每当你想要从文件中读取时,你必须首先打开一个新的文件变量或使用 seek() 方法,这超出了本教程的范围。如果你想了解更多,Python 对这些方法有很好的文档。

现在我们已经从文件中读取了内容,让我们学习如何写入新文件。

步骤 4 —— 写入文件

在这一步中,你将写入一个新文件,其中包括标题 Days of the Week,后面跟着第一个文件的内容。首先,创建一个 title 变量。

title = 'Days of the Week\n'

你还需要将一周的天数存储在一个变量中,我们将其称为 days。这段代码以读模式打开文件,读取文件,并将读取操作返回的输出存储在我们的新变量 days 中。为了更容易理解,步骤 2 中的代码已经包含在内。

path = '/home/sammy/days.txt'
days_file = open(path, 'r')
days = days_file.read()

现在你有了标题和一周的天数的变量,你可以开始写入新文件。首先,指定文件的位置。同样,我们将使用目录 /home/sammy/,所以我们的路径将是 /home/sammy/new_days.txt。然后,你可以使用 open() 函数以写模式打开新文件,指定 'w' 模式。

new_path = '/home/sammy/new_days.txt'
new_days = open(new_path, 'w')

一旦打开了新文件,你可以使用 write() 方法添加数据。这个方法接受一个字符串参数,并将该数据写入文件。如果你想在文件中开始新的一行,你必须显式提供换行符 \n,这在你将 'Days of the Week\n' 赋给 title 变量时已经包含在内。

将标题写入文件,然后是一周的天数。可能有助于添加一些 print 语句来跟踪我们要写入文件的内容,这通常用于跟踪脚本的进度。

new_days.write(title)
print(title)new_days.write(days)
print(days)

最后,当你完成对文件的操作时,关闭文件是很重要的。

步骤 5 —— 关闭文件

关闭文件确保磁盘上的文件与文件句柄之间的连接已经结束。关闭文件还确保其他程序能够访问它们,并保持你的数据安全。如果你没有像 步骤 6 中描述的那样使用 with 语句,一定要确保关闭你的文件。在这个例子中,使用 close() 方法关闭所有文件。

days_file.close()
new_days.close()

现在脚本完成了对文件的操作,它使用 close() 方法释放了文件句柄。

步骤 6 —— 使用 with 语句(可选)

在 Python 中处理文件的推荐方式(通常称为Pythonic方式)是使用语言的一个特性,称为 with 语句。这些语句是设置一个上下文进行工作的简写方式,一旦上下文结束,最终的细节将自动处理,以防止常见的错误。在处理文件的情况下,with 语句将自动关闭文件,这样一旦你完成任务,就不会有文件句柄残留。

与 Python 中的任何块一样,比如函数定义、if 语句或循环,with 语句采用一个简单语句后跟一个 :,然后是一个缩进的代码块。下面是一个打开文件并打印其内容的代码示例:

with open('/home/sammy/days.txt', 'r') as days_file:days = days_file.read()print(days)

让我们逐步了解这段代码的作用。与之前一样,我们使用 Python 的内置 open() 函数打开文件,传递文件路径和模式参数。然而,由于我们使用了 with 语句,而不是使用 = 将结果的文件句柄分配给一个变量,我们使用 as 关键字进行分配。这是完整 with 语句语法的一部分:

with action as result:. . .

: 之后,我们移到下一行并缩进我们的代码,这是 Python 组织功能块的方式。与之前一样,我们可以在 days_file 变量中访问文件句柄,因此我们可以调用 read() 方法来获取所有内容,并将其 print() 出来。

请注意,这里没有调用 close() 方法。这是因为一旦代码离开这个块(也就是说,一旦下一行的代码不再缩进,或者文件结束了),with 语句的上下文就知道自动关闭这些文件。这样做的好处不仅在于你不需要记住每次都关闭文件,而且你处理特定文件的所有逻辑在该块内视觉上和逻辑上都是清晰的。这种结构有助于保持代码的清晰和可读性。

有了这个理解,让我们使用 with 语句重新编写我们之前的代码:

with open(path, 'r') as days_file, open(new_path, 'w') as new_days:days = days_file.read()new_days.write(title)new_days.write(days)print(title)
print(days)

现在代码更加有组织。我们首先像之前一样定义了一些变量:我们两个文件的路径和我们将用于新文件标题的标题。之后,我们开始我们的 with 语句,打开我们的两个文件,并将它们的连接存储在适当命名的变量中。与之前一样,我们读取了 days_file 的内容,然后将标题和这些内容写入了 new_days。最后,我们通过取消缩进代码块来结束该块,以打印我们读取的 titledays 的值。

虽然有一些情况下你会想要使用之前描述的 close() 方法,而且了解它的工作原理很重要,但在 Python 中处理文件时,你通常会使用 with 语句。

第 7 步 — 检查我们的代码

在运行代码之前,最好确保一切看起来都是正确的。最终的产品应该是这样的:

path = '/home/sammy/days.txt'
new_path = '/home/sammy/new_days.txt'
title = 'Days of the week\n'with open(path, 'r') as days_file, open(new_path, 'w') as new_days:days = days_file.read()new_days.write(title)new_days.write(days)print(title)
print(days)

保存代码后,打开终端并运行你的 Python 脚本,就像这样:

python files.py

输出将如下所示:

Days of the WeekMonday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

现在,通过打开新文件(new_days.txt)来完全检查代码是否运行正常。如果一切顺利,它应该包含以下内容:

Days of the Week
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

结论

在本教程中,我们学习了如何在 Python 3 中处理和操作纯文本文件。现在你可以在 Python 中打开、读取、写入和关闭文件,并且可以继续在 Python 中处理自己的数据。Python 在处理输入和输出时提供了许多其他有用的方法,并且还提供了文档以便进一步学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlalchymy expire_on_commit

在 SQLAlchemy 中,expire_on_commit 是一个会话(Session)级别的选项,它决定了在事务提交后,会话中的对象是否应该被标记为“过期”(expired)。当一个对象被标记为过期时,它的所有属性…

25.梯度消失和梯度爆炸

深度学习中的梯度消失与梯度爆炸:定义、原因、解决办法与残差网络 一、引言 在深度学习的训练过程中,梯度消失(Gradient Vanishing)和梯度爆炸(Gradient Exploding)是两个常见且棘手的问题。它们严重阻碍…

Python时间序列分析库

Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…

一个比官方strings.Title更精简高效的将字符串中所有单词首字母转换为大小写的go函数

在go语言的官方包 strings中,官方提供了Title函数用于将字符串中的单词首字母转换为大写,这个函数很绕,对于要转换的字符串先是一个Map循环,然后接着又是一个Map循环,且函数调函数掉了好多层,而且最新版本中已经标记为…

【原创】springboot+mysql小区用水监控管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

介绍一个 SpringBoot 集成各种场景的项目

springboot-demo 今天给大家介绍一个 SpringBoot 集成各种场景的项目,可以用来学习,也可以开箱即用,无需重复造轮子!包含中英文使用说明文档 a simple springboot demo with some components for example: redis,solr,rockmq an…

洛谷 P3379:最近公共祖先(LCA)← 倍增+链式前向星

【题目来源】https://www.luogu.com.cn/problem/P3379【题目描述】 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。【输入格式】 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−…

AI 定位!GeoSpyAI上传一张图片分析具体位置 不可思议! ! !

🏡作者主页:点击! 🤖常见AI大模型部署:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2024年6月16日12点23分 🀄️文章质量:94分…

动态规划日常刷题

力扣70.爬楼梯 class Solution {public int climbStairs(int n) {return dfs(n);}//递归 //注意每次你可以爬 1 或 2 个台阶//如果最后一步是1 就先爬到n-1 把它缩小成0-n-1的范围//如果最后一步是2 就先爬到n-2 把它缩小成0-n-2的范围 private int dfs(int i){if(i < 1){r…

代码随想录算法训练营第五十九天|115.不同的子序列、 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

代码随想录算法训练营第五十九天 115.不同的子序列 题目链接&#xff1a;115.不同的子序列 确定dp数组以及下标的含义&#xff1a;dp[i][j] &#xff1a;以下标i - 1为结尾的s&#xff0c;和以下标j - 1为结尾的t&#xff0c;s中t的个数dp[i][j]确定递推公式&#xff1a; s[…

vue3 如何给表单添加表单效验+正则表达式

校验要求 我们的表单中有密码、电话号码 &#xff0c;两项。 我们设置用密码为3到20位的非空字符 电话号码就用目前用的电话号码正则表达式&#xff0c;要求手机号码以 1 开头&#xff0c;第二位为 3 到 9 之间的数字&#xff0c;后面跟着任意 9 个数字&#xff0c;总共是 11…

Intel HDSLB 高性能四层负载均衡器 — 代码剖析和高级特性

目录 文章目录 目录前言代码剖析软件架构目录结构配置解析启动流程分析数据面 jobs 注册数据面 jobs 执行 转发流程分析收包阶段L2 处理阶段L3 处理阶段L4 处理阶段 高级特性大象流转发优化快慢路径分离转发优化报文基础转发优化 最后参考文档 前言 在前 2 篇文章中&#xff0…

超详细的描述UItralytics中的特征增强方法

目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) 各个特征增强参数概述 各个参数优缺点与调整技巧 1. hsv_h (色调调整) 2. hsv_s (饱和度调整) 3. hsv_v (亮度调整) 4. degrees (图像旋转) 5. translate (图像平移) 6. scale (图像缩放) 7. shear (图像剪切) …

Qt第三方库QHotKey设置小键盘数字快捷键

一、看了一圈没有找到可以设置小键盘的情况。 这两天在研究快捷键的使用。发现qt的里的快捷键不是全局的。找了两个第三方快捷键QHotKey&#xff0c;还有一个QxtGlobalShortcut。但是这两个都不能设置小键盘的数字。 比如QKeySequenceEdit &#xff08;Ctrl1&#xff09; 这个…

【SpringBoot】SpringBoot:构建实时聊天应用

文章目录 引言项目初始化添加依赖 配置WebSocket创建WebSocket配置类创建WebSocket处理器 创建前端页面创建聊天页面 测试与部署示例&#xff1a;编写单元测试 部署扩展功能用户身份验证消息持久化群组聊天 结论 引言 随着实时通信技术的快速发展&#xff0c;聊天应用在现代We…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

MySQL基础——多表查询和事务

目录 1多表关系 2多表查询概述 3连接查询 3.1内连接 3.2左外连接 3.3右外连接 3.4自连接 4联合查询 5子查询 5.1标量子查询(子查询结果为单个值) 5.2列子查询(子查询结果为一列) 5.3行子查询(子查询结果为一行) 5.4表子查询(子查询结果为多行多列) 6事务简介和操…

vulnhub靶场-xxe打靶教程

目录 靶机导入 信息收集 发现IP 端口扫描 目录扫描 漏洞利用 靶机下载地址&#xff1a;XXE Lab: 1 ~ VulnHub 靶机导入 导入虚拟机 开启虚拟机 信息收集 发现IP arp-scan -l 发现靶机IP是192.168.202.150 端口扫描 使用nmap进行扫描 nmap -sS -A 192.168.202.150 …

EasyRecovery2024数据恢复神器#电脑必备良品

EasyRecovery数据恢复软件&#xff0c;让你的数据重见天日&#xff01; 大家好&#xff01;今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件&#xff01;你是不是也曾经遇到过不小心删除了重要的文件&#xff0c;或者电脑突然崩溃导致数据丢失的尴尬情况呢&…

初识PHP

一、格式 每行以分号结尾 <?phpecho hello; ?>二、echo函数和print函数 作用&#xff1a;两个函数都是输出内容到页面中&#xff0c;多用于代码调试。 <?php echo "<h1 styletext-align: center;>test</h1>"; print "<h1 stylet…