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

Monday
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.mfbz.cn/a/713088.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django初学者指南

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 使用2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 安装Django3.2 创建Django项目3.3 运行开发服务器3.4 创建…

【纯干货级教程】深度学习根据loss曲线进行分析调参

相信很多刚刚接触目标检测系列算法小伙伴跑深度学习算法时会有许多困惑,比如训练得出的loss曲线有什么意义?训练的一些参数要如何设置选择?选择哪个算法模型作为baseline、选择哪个参数量/复杂度/深度的模型进行训练最为合适? 本…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

如何在WIndows虚拟机安装 macOS 黑苹果系统?

在本教程中&#xff0c;我们将介绍如何在虚拟机上安装 macOS 黑苹果系统。黑苹果系统是非苹果公司官方支持的 macOS 系统的非官方版本&#xff0c;可以在普通 PC 上运行。请注意&#xff0c;安装黑苹果系统可能违反苹果的许可协议&#xff0c;请自行承担风险。参考视频教程&…

Linux之BCC 性能工具的移植和使用

一、bcc 工具 bcc 的全称&#xff1a;BPF Compiler Collection BCC&#xff08;BPF Compiler Collection&#xff09;是一个用于创建高效的内核跟踪和操作程序的工具包&#xff0c;包含了几个有用的工具和示例。它利用了扩展的BPF&#xff08;Berkeley Packet Filters&#x…

欧洲杯赛况@20240615

点击标题下「蓝色微信名」可快速关注 欧洲杯首战&#xff0c;德国5:1狂胜苏格兰&#xff0c;大比分、红点套餐、超新星登场进球&#xff0c;好像这些能想到的元素都发挥了作用&#xff0c;作为东道主&#xff0c;聚集了天时地利人和&#xff0c;可以说是完美&#xff0c;这就是…

记录:利用 Agora 在 Unity3D MRTK场景中创建实时视频聊天应用

目录 准备1. 安装Agora_Unity_RTC_SDK2. 创建UI3. script具体内容4. 使用测试 本质是两部带摄像机的设备同时进入Agora聊天室内视频。 去年实现过一次这个功能&#xff0c;用的是Agora_Unity_RTC_SDK 4.2.2版本的&#xff0c;今年使用失败&#xff0c;遂重新安装最新版本Agora…

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件&#xff0c;因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…

中文版svn怎么忽略文件

个人需求&#xff1a; 不上传dist&#xff0c;dist.7z&#xff0c;node_modules等文件夹 实际操作&#xff1a; 前言&#xff1a;在上传svn为避免操作失败导致丢失文件的情况&#xff0c;保险起见&#xff0c;先备份代码 1&#xff1a;右键点击 2&#xff1a;点击新建 – 其…

【C++】图1

并查集 template <class T> class UnionFindSet { public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){int root1 FindRoot(x1);int root2 FindRoot(x2);if (root1 root2)return;if (root1 > root2)swap(root1, root2);_ufs[root1] _ufs[ro…

uniapp开发微信小程序问题汇总

1. 自定义校验规则validateFunction失效 2. 微信小程序不支持<Br>换行 在 <text></text> 标签中使用\n(必须 text 标签&#xff0c;view 标签无效 ) 3. 微信小程序无法使用本地静态资源图片的解决方法 (1) 将图片上传到服务器&#xff0c;小程序访问该图片…

非对称加密系统解析

目录 1. 概述 2. 非对称加密标准 2.1 RSA 2.2 SM2 2.2.1 SM2私钥 2.2.2 SM2公钥 2.2.3 加密数据格式 2.2.4 签名数据格式 1. 概述 非对称加密中&#xff0c;密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密&#xff0c;接收者用解密密钥对密文进行解密…

Leetcode - 132双周赛

目录 一、3174. 清除数字 二、3175. 找到连续赢 K 场比赛的第一位玩家 三、3176. 求出最长好子序列 I 四、3177. 求出最长好子序列 II 一、3174. 清除数字 本题可以使用栈来模拟&#xff0c;遇到数字弹出栈顶元素&#xff0c;遇到字母入栈。 代码如下&#xff1a; //使用字…

网络编程(二)TCP

一、TCP网络编程 网络编程模型&#xff1a; C/S模型&#xff1a;客户端服务器模型 优点&#xff1a; 客户端可以缓存一些数据&#xff0c;使用时直接在本地读取&#xff0c;无需每次重新下载&#xff1b; 由于客户端和服务器都是自己开发的&#xff0c;可以自定义协议 缺点&a…

基于carsim的线控转向仿真(1)--carsim车辆模型目标角度跟踪

一、Rwa转向执行总成建模 Rwa包括齿轮齿条机构、转向组件以及转向执行电机&#xff1b;如下图&#xff0c;电机输出轴通过齿轮减速增扭后&#xff0c;再经过一个半径为rp的小齿轮&#xff0c;直接带动齿条左右移动。齿条的移动通过转向摇臂&#xff0c;带动车轮转动&#xff0c…

Excel/WPS《超级处理器》功能介绍与安装下载

超级处理器是基于Excel或WPS开发的一款插件&#xff0c;拥有近300个功能&#xff0c;非常简单高效的处理表格数据&#xff0c;安装即可使用。 点击此处&#xff1a;超i处理器安装下载 Excel菜单&#xff0c;显示如下图所示&#xff1a; WPS菜单显示&#xff0c;如下图所示&am…

15. 第十五章 类和对象

15. 类和对象 到现在你已经知道如何使用函数组织代码, 以及如何使用内置类型来组织数据. 下一步将学习面向对象编程, 面向对象编程使用自定义的类型同时组织代码和数据. 面向对象编程是一个很大的话题, 需要好几章来讨论.本章的代码示例可以从↓下载, https://github.com/Alle…

嵌入式实训day3

1、 # 82261773 # y6ufuT9yGQxddpSzSe3zZpbP # BJsEfKFNGOwHtLuKoHsfVIWrGWjXVKut"""1、PC需要联网2、不能使用MicroPython解释器 """ from aip import AipFace import base64# 查看REST-API-SDK if __name__ "__main__":# 设置APP_I…

数字电路中二进制的数据表达

文章目录 1. 二进制数据表达 1.1 二进制简介 1.2 用二进制表达文字 1.2.1 最开始的表达方式 1.2.2 通讯系统的编码和解码 1.2.3 集成电路 1.2.4 ASCII编码 1.2.5 GBK编码 1.2.6 Unicode编码 2. 用二进制表达图像 2.1 图片像素化 2.2 像素数字化 2.3 二值图像 2.4…

C++ 43 之 自增运算符的重载

#include <iostream> #include <string> using namespace std;class MyInt{friend ostream& operator<< (ostream& cout , MyInt& int1); public:MyInt(){this->m_num 0;}// 前置自增&#xff1a; 成员函数实现运算符的重载 返回的是 引用&a…