Python文件读写与字符编码详解【第25篇—python基础知识】

news2024/11/18 15:40:42

文章目录

  • 文件读写和字符编码在Python中的实现
    • 一、I/O操作概述
    • 二、文件读写实现原理与操作步骤
      • 1. 文件读写实现原理
      • 2. 文件读写操作步骤
    • 三、文件打开模式
    • 四、Python文件操作步骤示例
    • 五、文件读取相关方法
      • 1. 读取指定长度的内容
      • 2. 读取文件中的一行内容
      • 3. 遍历打印一个文件中的每一行
    • 六、文件读写与字符编码
    • 七、上下文管理器与`with`语句
    • 八、文件写操作
    • 九、文件操作的异常处理
    • 十、文件指针的操作
    • 十一、其他文件方法
    • 十二、总结

文件读写和字符编码在Python中的实现

一、I/O操作概述

I/O(Input/Output)在计算机中指的是数据的输入和输出,涉及数据在内存和外部设备(如磁盘、网络)之间的流动。输入流(Input Stream)表示数据从外部流向内存,而输出流(Output Stream)表示数据从内存流向外部。在程序运行时,数据通常存储在内存中,由CPU执行操作。然而,涉及到与外部设备(通常是磁盘或网络)进行数据交换的地方,就需要使用 I/O 接口。

操作系统是一个通用的软件程序,提供了许多功能,包括硬件驱动、进程管理、内存管理、网络管理、安全管理以及 I/O 管理。操作系统屏蔽了底层硬件,向上提供通用接口。因此,I/O 的能力由操作系统提供,而高级编程语言将操作系统提供的底层接口封装起来,供开发者使用。Python也不例外。

二、文件读写实现原理与操作步骤

1. 文件读写实现原理

文件读写是一种常见的 I/O 操作。Python等高级编程语言封装了底层的操作系统接口,直接提供了文件读写的相关方法。通常,文件读写的对象是文件描述符(file descriptor),它是通过请求操作系统打开一个文件(通常称为文件路径)获得的。Python 中使用 open() 函数获取文件对象。

2. 文件读写操作步骤

文件读写的步骤在不同编程语言中大致相同:

  1. 打开文件,获取文件描述符: 使用内置函数(如 Python 的 open())传递文件路径和打开模式等参数,获取文件对象的文件描述符。

  2. 操作文件描述符(读/写): 通过文件描述符进行读写操作,可以使用不同的方法和模式来满足需求。

  3. 关闭文件: 完成文件读写操作后,及时关闭文件。这是为了释放操作系统资源和确保数据的完整性。

需要注意的是,文件读写操作完成后应该及时关闭文件。一方面,文件对象会占用操作系统的资源;另一方面,操作系统对同时打开的文件描述符数量有限制。如果不及时关闭文件,可能导致资源泄漏和数据丢失。

三、文件打开模式

在不同编程语言中,打开文件的方法都需要指定文件打开模式。常见的文件打开模式包括只读(‘r’)、只写(‘w’)、只追加(‘a’)、读写(‘r+’)、写读(‘w+’)、追加读写(‘a+’)等。此外,还有处理二进制文件的模式(‘b’)。

# Python中的文件打开模式
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

在打开文件时,指定不同的模式可以实现读、写、追加等不同的操作。

四、Python文件操作步骤示例

让我们以读取一个文本文件 example.txt 的内容为例:

# Python文件操作示例
file_path = 'example.txt'

# 最基本的文件读取
with open(file_path, 'r') as file:
    content = file.read()
    print(content)

这是一个简单的文件读取操作,使用 with 语句保证文件在使用完毕后被正确关闭。Python 3 提供了更加简洁的语法,同时处理了字符编码的问题,不再需要手动进行解码。这样的实践方式既简单又安全。

五、文件读取相关方法

Python 提供了多种文件读取方法,可以根据需求选择合适的方式:

  • read(): 一次性读取文件所有内容,返回一个字符串。
  • `read(size)

`: 每次最多读取指定长度的内容,返回一个字符串。

  • readlines(): 一次性读取文件所有内容,按行返回一个列表。
  • readline(): 每次只读取一行内容。

此外,还有两个与文件指针位置相关的方法:

  • seek(n): 将文件指针移动到指定字节的位置。
  • tell(): 获取当前文件指针所在字节位置。

下面是一些文件读取的实例操作:

1. 读取指定长度的内容

with open('example.txt', 'r', encoding='utf-8') as file:
    print(file.read(12))

2. 读取文件中的一行内容

with open('example.txt', 'r', encoding='utf-8') as file:
    print(file.readline())

3. 遍历打印一个文件中的每一行

with open('example.txt', 'r', encoding='utf-8', newline='') as file:
    for line in file:
        print(line, end='')

这里注意到 newline='' 的设置,以避免在不同操作系统上产生的换行符问题。

六、文件读写与字符编码

在进行文件读写时,涉及到字符编码的指定。不同的编程语言和操作系统有默认的字符编码,但在文件读写时,最好明确指定字符编码,以确保数据的正确传输。

在 Python 中,文件读写时可以通过 open() 函数的 encoding 参数指定字符编码。例如:

# 读操作
with open('example.txt', 'r', encoding='utf-8') as file:
    print(file.read())

# 写操作
with open('example.txt', 'w', encoding='utf-8') as file:
    file.write('你好')

如果不指定字符编码,将使用平台相关的默认编码。在 Python 3 中,默认编码是与平台有关的,例如在 Windows 上是 GBK,而在 Linux 上是 UTF-8。

在 Python 2 中,需要手动进行编码和解码操作。读取文件时,需要使用 decode() 方法解码为字符串;写入文件时,需要使用 encode() 方法将字符串编码为字节串。

# 读操作(Python 2)
with open('example.txt', 'r') as file:
    content = file.read().decode('utf-8')

# 写操作(Python 2)
with open('example.txt', 'w') as file:
    file.write(u'你好'.encode('utf-8'))

在文件读写中,及时关闭文件并明确字符编码是良好的实践习惯,以确保数据的正确性和程序的健壮性。

七、上下文管理器与with语句

在文件读写中,使用 with 语句是一种良好的实践,它允许我们以一种清晰、简洁的方式打开和操作文件。同时,with 语句配合上下文管理器确保文件在使用后正确关闭。

在 Python 中,文件对象支持上下文管理协议,即实现了 __enter__()__exit__() 方法。with 语句在执行时,会调用文件对象的 __enter__() 方法获取资源,并在退出时调用 __exit__() 方法释放资源。这样可以避免因忘记关闭文件而导致的资源泄漏问题。

# 使用with语句读取文件
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
# 文件在离开with代码块后自动关闭

八、文件写操作

在这里插入图片描述

文件写操作通常用于将程序中的数据写入文件中。Python 提供了多种写入文件的方法,可以根据需求选择适合的方式。

# 写入字符串到文件
with open('output.txt', 'w', encoding='utf-8') as file:
    file.write('Hello, World!\n')
    file.write('你好,世界!\n')

上述代码使用 write() 方法将字符串写入文件,\n 表示换行符。注意在使用 'w' 模式打开文件时,如果文件已存在,会清空文件内容;如果文件不存在,会创建一个新文件。

九、文件操作的异常处理

文件读写操作可能会涉及到异常,例如文件不存在、权限问题、文件损坏等。因此,为了确保程序的健壮性,需要在文件操作时添加适当的异常处理机制。

try:
    with open('example.txt', 'r', encoding='utf-8') as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件未找到")
except PermissionError:
    print("无文件访问权限")
except Exception as e:
    print(f"发生异常:{e}")

在上述代码中,通过 tryexcept 语句捕获了可能发生的异常。FileNotFoundError 用于捕获文件不存在的异常,PermissionError 用于捕获文件权限问题的异常,而 Exception 用于捕获其他未知异常。

十、文件指针的操作

文件指针表示文件中当前操作的位置。在文件读写中,文件指针的位置决定了下一次读写操作的位置。

  • seek(offset, whence): 将文件指针移动到指定位置。offset 表示移动的字节数,whence 表示移动的相对位置(0 表示文件开头,1 表示当前位置,2 表示文件结尾)。
with open('example.txt', 'r', encoding='utf-8') as file:
    file.seek(5)  # 将文件指针移动到第6个字节的位置
    content = file.read()
    print(content)
  • tell(): 获取当前文件指针所在位置的字节偏移量。
with open('example.txt', 'r', encoding='utf-8') as file:
    print(file.tell())  # 获取当前文件指针位置
    content = file.read()
    print(content)
    print(file.tell())  # 获取读取后的文件指针位置

这些文件指针的操作方法可以用于在文件中定位和控制读写的位置。

十一、其他文件方法

除了上述介绍的方法外,文件对象还提供了其他一些方法:

  • flush(): 刷新缓冲区数据,将缓冲区中的数据立刻写入文件。
  • next(): 读取文件下一行,这个方法也是文件对象实例可以被当做迭代器使用的原因。
  • truncate(size=None): 截取文件中指定字节数的内容,并覆盖保存到文件中。如果不指定 size 参数,则文件将被清空。在 Python 2 中无返回值,在 Python 3 中返回新文件的内容字节数。
  • writelines(sequence): 向文件写入一个字符串或一个字符串列表,如果字符串列表中的元素需要换行,要自己加入换行符。
  • fileno(): 返回一个整型的文件描述符,可以用于一些底层 IO 操作上(如 os 模块的 read 方法)。
  • isatty(): 判断文件是否被连接到一个虚拟终端,是则返回 True,否则返回 False

这些方法可以根据实际需求来选择使用,提供了更多文件操作的灵活性。

十二、总结

文件读写是编程中常见的 I/O 操作,掌握文件操作的基本步骤、常用方法以及异常处理是 Python 编程的基础之一。通过 with 语句和上下文管理器,能够更加简洁、安全地进行文件操作。同时,理解文件指针的概念以及其他文件对象的方法,可以更灵活地处理文件的读写。良好的文件读写习惯有助于编写清晰、健壮的程序。

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

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

相关文章

Zookeeper使用详解

介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布…

【搭建个人知识库-3】

搭建个人知识库-3 1 大模型开发范式1.1 RAG原理1.2 LangChain框架1.3 构建向量数据库1.4 构建知识库助手1.5 Web Demo部署 2 动手实践2.1 环境配置2.2 知识库搭建2.2.1 数据收集2.2.2 加载数据2.2.3 构建向量数据库 2.3 InternLM接入LangChain2.4 构建检索问答链1 加载向量数据…

鸿蒙应用开发学习:让page页面强制横屏

一、学习做了个适合横屏的页面但进入页面后是竖屏显示的 前几天在B站上跟着 黑马程序员的 HarmonyOS4.0开发应用教学视频学习了显式动画(animateTo)和属性动画(animation)功能,并参照教学视频的内容做了个小鱼动画。…

基于MOD02/MYD02获得亮度温度再转冰温

用HEG处理MOD02/MYD02,提取里面的EV_1KM_Emissive波段,band为11和12(其实就是band 31和32)。注意这里的band和output dile type 1. 获得之后,转辐射亮度。 参考:https://www.cnblogs.com/enviidl/p/16539422.html radiance_scales,和radiance_offset这两项参数代表波段…

实现STM32烧写程序-(4) BIN文件结构

简介 BIN文件是一种二进制文件格式,用于存储和传输二进制数据。它包含了计算机或设备可以直接读取和执行的原始二进制数据。BIN文件通常用于存储程序、固件或其他二进制数据,例如嵌入式系统的固件、操作系统的映像文件等。 BIN文件的起源可以追溯到计算机…

学习Vue配置代理总结

今天学习了Vue的配置代理,当我们想要向服务器取回来数据时就先要向服务器发送请求,但前端发送请求的方式也有很多种,首先是发送请求的鼻祖JS的XMLHttpRequest(xhr),它操作起来相对麻烦,开发中也…

mysql5.7之从入门到放弃

系列文章目录 第一章 MySQL5.7之从入门到放弃 第二章 MySQL从入门到放弃之数据库体系结构与管理 第三章 MySQL基础应用之DDL、DCL、DML、DQL 第四章 MySQL之多表连接查询、AS别名、扩展内容 文章目录 系列文章目录前言一、Mysql的介绍和安装?1、什么是数据&#xf…

SqlAlchemy使用教程(二) 入门示例及编程步骤

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解 二、入门示例与基本编程步骤 在第一章中提到,Sqlalchemy提供了两套方法来访问数据库,由于Sqlalchemy 官方文档结构有些乱,对于ORM的使用步骤的描…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64,下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init,初始化当前目录成为git仓库…

【Unity】【VRTK】【Pico】如何快速在VRTK中引入带动画的PICO控制器

【背景】 之前的VRTK篇章中,我只介绍了Oculus,Open VR,SImulator这三种Rig的配置方法,那么Pico如何融合VRTK进行开发呢? 【需要的开发包】 先像一个正常PICO项目那样导入PICO的SDK到Unity。VRTK 4的Package导入器中搜Pico,可以导入一个Pico的Integration,导入后Projec…

NLP论文阅读记录 - 2021 | WOS 智能树提取文本摘要深度学习

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 An Intelligent Tree Extractive Text Summarization Deep Learning …

NAT技术的原理、和实现方式介绍

目 录 一、关于内外网的网络问题 1、内网 2、外网 3、如何实现内网访问外网 4、外网如何访问公司内部的一个服务器? 二、NAT技术简介 三、NAT技术的基本原理。 四、内部网实现NAT的常用方式 1.静态转换 2.动态转换 3.端口多路复用(Por…

人工智能主流技术详解

人工智能(Artificial Intelligence,简称AI)是当今科技领域发展最迅速、最令人振奋的分支之一。本文将带您深入了解人工智能的主流技术,探索AI如何影响我们的生活、工作以及未来的发展。 一、什么是人工智能? 人工智能&…

SpringBoot+SSM项目实战 苍穹外卖(11) Apache ECharts

继续上一节的内容,本节学习Apache ECharts,实现营业额统计、用户统计、订单统计和销量排名Top10功能。 数据统计效果图: 目录 Apache ECharts入门案例 营业额统计用户统计订单统计销量排名Top10 Apache ECharts Apache ECharts 是一款基于 …

微信小程序(一)简单的结构及样式演示

注释很详细&#xff0c;直接上代码 涉及内容&#xff1a; view和text标签的使用类的使用flex布局水平方向上均匀分布子元素垂直居中对齐子元素字体大小文字颜色底部边框的宽和颜色 源码&#xff1a; index.wxml <view class"navs"><text class"active…

Leetcode3002. 移除后集合的最多元素数

Every day a Leetcode 题目来源&#xff1a;3002. 移除后集合的最多元素数 解法1&#xff1a;贪心 可以将数组去重后分为三个部分&#xff1a;nums1 独有的&#xff0c;nums2 独有的&#xff0c;nums1 与 nums2 共有的。 求集合 S 时&#xff1a; 先选择两个数组独有的。…

vcs makefile

主要参考&#xff1a; VCS使用Makefile教程_vcs makefile-CSDN博客https://blog.csdn.net/weixin_45243340/article/details/129255218?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170524049516800227431373%2522%252C%2522scm%2522%253A%252220140713.1301023…

强化学习应用(四):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

12AOP面向切面编程/GoF之代理模式

先看一个例子&#xff1a; 声明一个接口&#xff1a; // - * / 运算的标准接口! public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j); }实现该接口&#xff1a; package com.sunsplanter.prox…

c#异形窗体遮罩效果

c#异形窗体遮罩效果&#xff0c;移动&#xff0c;关闭&#xff0c;最大化&#xff0c;最小化&#xff0c;还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…