掌握Python文件操作:从基础到高阶的全方位探索

news2025/2/10 9:41:22

在本篇博客中,我们将全面、深入地探讨Python中的文件操作。文件操作在Python编程中是不可或缺的一部分,它包含了打开、读取、写入和关闭文件等各种操作。我们将从基础的文件操作讲解到高级的文件处理技巧,以及如何优雅地使用Python进行文件操作。每一部分我们都会分享一些独特的用法,并且附有具体的示例代码和输出结果。在文章的最后,我们还将分享一些鲜为人知但非常实用的文件操作技巧。

B站项目实战视频:​ Python自动化测试:60个实战项目,手把手教你

基础文件操作:打开、读取、写入和关闭文件

Python使用内置的open()函数来打开一个文件,它返回一个文件对象,常用的模式如下:'r'表示读取,'w'表示写入(会先清空原有文件),'a'表示追加,'b'表示二进制模式。特别的,我们可以使用with关键字,这样当我们完成操作后,文件将自动关闭。

# 以读取模式打开一个文件
with open('file.txt', 'r') as file:
    content = file.read()
print(content)

当你运行这段代码,假设file.txt的内容是Hello, Python!,你会看到以下输出:

Hello, Python!

文件读取:细粒度控制

除了一次性读取整个文件,我们还可以以更小的单位来读取文件。这对于处理大文件时非常有用,可以有效控制内存的使用。

with open('file.txt', 'r') as file:
    while True:
        line = file.readline()
        if not line:
            break
        print(line, end='')

这段代码会逐行读取file.txt文件的内容并打印。其中,end=''是为了防止print函数在每次打印后都插入一个换行符,因为从文件中读取的每一行都已经带有一个换行符。

文件写入:内容追加与覆盖

我们使用写入模式('w')或追加模式('a')来写入文件。这里有一个小技巧:如果你的程序需要频繁写入文件,那么在写入时使用\n来换行会比使用write()函数后再使用write('\n')函数来插入新行更有效率。

with open('file.txt', 'a') as file:
    file.write('Hello, Python!\n')

这段代码会在file.txt文件的末尾追加一行Hello, Python!

更高级的文件处理:osshutil模块

Python的os模块和shutil模块为我们提供了更高级的文件操作功能,如重命名文件、删除文件、创建

目录、复制文件等。

import os
import shutil

# 创建一个新的目录
os.mkdir('new_folder')

# 重命名文件
os.rename('old.txt', 'new.txt')

# 复制文件
shutil.copy2('src.txt', 'dst.txt')

# 删除文件
os.remove('file_to_delete.txt')

运行这段代码会按顺序执行上述文件操作。

文件编码:处理不同编码格式的文件

在处理文件时,我们可能会遇到各种不同的编码格式,如UTF-8, ASCII, ISO-8859-1等。Python的open()函数允许我们通过encoding参数来指定文件的编码方式。

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

如果你尝试读取一个包含非ASCII字符的文本文件,但没有提供正确的编码参数,Python可能会抛出UnicodeDecodeError。在这种情况下,你需要知道文件的正确编码格式才能正确地读取文件。

# 尝试读取一个包含非ASCII字符的文件,但没有指定正确的编码格式
try:
    with open('file.txt', 'r') as file:
        content = file.read()
except UnicodeDecodeError:
    print("UnicodeDecodeError occurred!")

这段代码会捕获UnicodeDecodeError并打印一个错误消息。

文件异常处理:确保代码的健壮性

在文件操作中,我们可能会遇到各种异常情况,例如文件不存在、没有读取/写入权限等。我们可以使用Python的异常处理机制来捕获这些异常并作出相应的处理。

try:
    with open('nonexistent_file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print('File does not exist!')
except PermissionError:
    print('No permission to read the file!')

这段代码会捕获FileNotFoundErrorPermissionError,并分别打印出相应的错误消息。

使用pickle进行对象序列化和反序列化

Python的pickle模块提供了将对象转换为一种可以存储到文件或在网络上传输的格式(这个过程称为序列化),以及从这种格式重新构造对象(这个过程称为反序列化)的功能。这是一种非常方便的方式来保存和加载Python对象。

import pickle

data = {
    'name': 'John',
    'age': 30,
    'pets': ['cat', 'dog']
}

# 序列化并保存到文件
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)

# 从文件加载并反序列化
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)

print(loaded_data)

运行这段代码,你会看到以下输出:

{'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}

这就是原始的data字典对象。

文件路径处理

在处理文件路径时,Python的os.path模块提供了一系列函数来解析、构造和修改文件路径。这些函数都是跨平台的,因此无论你的程序运行在Windows、macOS还是Linux上,都可以安全地使用它们。

import os

# 获取文件的绝对路径


abs_path = os.path.abspath('file.txt')
print(f'Absolute path: {abs_path}')

# 获取文件所在的目录
dir_name = os.path.dirname(abs_path)
print(f'Directory: {dir_name}')

# 获取文件的基本名和扩展名
base_name = os.path.basename(abs_path)
print(f'Base name: {base_name}')
root, ext = os.path.splitext(base_name)
print(f'Root: {root}, Extension: {ext}')

假设file.txt位于/home/user/documents/目录下,运行这段代码会输出:

Absolute path: /home/user/documents/file.txt
Directory: /home/user/documents
Base name: file.txt
Root: file, Extension: .txt

One More Thing: 文件遍历和搜索

Python的os模块提供了一个os.walk()函数,这是一个简单易用但强大的工具,用于在目录树中生成文件名。结合fnmatch模块,我们可以实现对文件的模式匹配搜索。

import os
import fnmatch

def find(pattern, path):
    result = []
    for root, dirs, files in os.walk(path):
        for name in fnmatch.filter(files, pattern):
            result.append(os.path.join(root, name))
    return result

# 查找当前目录及其所有子目录中的所有.txt文件
print(find('*.txt', '.'))

假设当前目录及其子目录下有file1.txtfile2.txtsub/file3.txt三个文件,运行这段代码会输出:

['./file1.txt', './file2.txt', './sub/file3.txt']

我们希望你能从这篇博客中学到Python文件操作的各种技巧,并能在你的Python编程之旅中发挥作用。如果你有任何问题或想法,欢迎留言交流。


感谢每一个认真阅读我文章的人,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

资料获取方式:

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

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

相关文章

前端vue入门(纯代码)07

【07.TodoList案例】 1 拆分组件 一共拆分为4个组件&#xff1a;【因为header和HTML内置的标签<header>重名&#xff0c;故在之前都加了Todo】 TodoHeaderTodoItem【item是list的子组件】TodoListTodoFooter 2 组件化编码流程 实现静态组件&#xff1a;抽取组件&…

金融行业项目信息化建设方案:人效提升300%

一、行业背景 在大数据、云计算、人工智能等技术的推动下数字化转型正快速改变着金融行业&#xff0c;特别在当下金融与科技深度交互融合的新阶段&#xff0c;“金融科技”正成为金融市场新的趋势。但是在众多传统的金融业务领域&#xff0c;特别是在“投融贷”相关的业务中&a…

深度学习5 -- 循环神经网络(代码实现篇+付详细流程文件)

引言 本文是使用pytorch对循环神经网络RNN(Recurrent Neural Network)的代码实现&#xff0c;作为之前介绍RNN原理的一个代码补充。 RNN原理介绍 本文代码相关介绍相对较为详细&#xff0c;也为自己的一个学习过程&#xff0c;对RNN的理解还是比较浅显&#xff0c;有错误的地…

迪赛智慧数——饼图(环形饼图):哪个年龄段的人最爱存钱?

效果图 50岁到60岁是存钱黄金10年,你存下钱了吗? 据央行发布的2022年金融统计数据报告显示&#xff0c;全年人民币存款额增加26.26万亿元&#xff0c;其中住户存款增加17.84万亿&#xff0c;刷新历史记录。 2022年在全国2200名40岁以下的人中&#xff0c;90后这一职场主力军…

电压放大器在无损检测中的作用和应用有哪些

电压放大器在无损检测中扮演着重要的角色&#xff0c;可以帮助实现信号的放大和增强&#xff0c;从而提高检测的灵敏度和准确性。下面&#xff0c;我们将详细探讨电压放大器在无损检测中的作用和应用。 图&#xff1a;ATA-2000系列高压放大器 电压放大器是一种用于放大电压信号…

Flink SQL之Interval Joins

1.Interval Joins&#xff08;区间Join&#xff09; 区间是双流join的优化&#xff0c;基于处理时间或事件时间&#xff0c;在一定时间区间内数据&#xff0c;相同的key进行join&#xff08;支持 Batch\Streaming&#xff09;。Interval Join 可以让一条流去 Join 另一条流中前…

BFT 最前线|北京智源发布悟道3.0大模型;马克龙会见Meta谷歌人工智能专家;马斯克:特斯拉市值未来将超过苹果与沙特阿美总和

文 | BFT机器人 AI视界 TECHNOLOGY NEWS 01 天垓100完成百亿级参数大模型训练 在第五届智源大会AI系统分论坛上&#xff0c;上海天数智芯半导体有限公司对外宣布&#xff0c;在天垓100加速卡的算力集群&#xff0c;基于北京智源人工智能研究院70亿参数的Aquila语言基础模型&am…

flink + Atlas 任务数据血缘调通

据此修改 Flink 源码 版本Flink1.13.5Atlas1.2.0 将 atlas 配置文件打进 flink-bridge&#xff1b;atlas 相关的 jar 放进 flink/lib jar uf flink-bridge-1.2.0.jar atlas-application.properties flink-conf.yaml 注册监听 org.apache.flink.configuration.ExecutionOpti…

6月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年6月5日-6月11日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

51、C++ 学习笔记

1、引用类型 引用类型是C引入的新类型&#xff0c;根据汇编的知识进行理解&#xff0c;程序在汇编后&#xff0c;变量名将失去意义&#xff0c;因为汇编码将替换成用内存的(链接地址or运行地址)访问变量。在C/C语言中&#xff0c;用变量名表示变量所占的那块内存&#xff0c;为…

仓储管理小程序开发 实现不同行业不同规模的仓管需求

在电子商务快速发展的时代&#xff0c;仓库管理对于一个企业的经营发展来说至关重要。如今互联网技术深入发展&#xff0c;很多企业都开发了信息化管理系统&#xff0c;仓库管理APP小程序就是企业结合自身的运算法则开发的一款线上应用软件&#xff0c;通过智能智慧仓库内人、物…

网络安全是一个好的专业吗?高考之后怎么选择?

目录 一.始于大学 二.一路成长 三. 如何学习网络安全 学前感言 零基础入门 尾言 本人信息安全专业毕业&#xff0c;在甲方互联网大厂安全部与安全乙方大厂都工作过&#xff0c;有一些经验可以供对安全行业感兴趣的人参考。 或许是因为韩商言让更多人知道了CTF&#xff0…

linuxOPS基础_LAMP开源项目实战

LAMP概述 LAMP&#xff1a;Linux Apache MySQL PHP LAMP 架构&#xff08;组合&#xff09; LNMP&#xff1a;Linux Nginx MySQL php-fpm LNMP 架构&#xff08;组合&#xff09; LNMPA&#xff1a;Linux Nginx(80) MySQL PHP Apache Nginx 代理方式 Apache&#…

Markdown编辑器使用

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

这所Top3顶尖院校,专业课太简单了,比双非还要简单!

一、学校及专业介绍 复旦大学&#xff08;FDU&#xff0c;简称旦旦&#xff09;&#xff0c;除清北之外的顶尖学府&#xff0c;想必不用我过多介绍&#xff0c;Top3之一&#xff08;众所周知&#xff0c;Top3有好多所图片&#xff0c;但我心目中的Top3永远是上海交大图片&#…

element-ui中表头添加自定义按钮以及其他自定义展示

可以使用&#xff1a;render-header方法即可 添加一个按钮如下&#xff1a; renderHeader (h) { return ( <div> <span>操作</span> <el-button type"primary" style"margin-left:90px" size"small" icon"el-icon-pl…

在测试外包干了4年,我废了...

外包公司值不值得去&#xff0c;是很多同行关心的话题。在职场一直流传着“外包不被当人看”“外包没有归属感”的言论。 客观来看&#xff0c;外包岗位确实存在一些缺点&#xff0c;比如&#xff1a;公积金&#xff0c;社保缴纳基数低&#xff0c;没有稳定的涨薪通道&#xff…

登录时token的存储

1.token是什么&#xff1f; 是一种身份的标识,比如我们入住一家酒店,他会给我们一张房卡,房卡的期限是有时间限制的,只有持有房卡的人才能入住酒店。 2.jsCookie 使用的方法 下包: npm i jscookie 导入: import Cookiejs from "js-cookie"; 使用: Cookie.js.set…

object类clone、finalize

2 什么是API API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集&#xff0c;但又无需访问源码或理解内部工作机制的细节. API是一种通用功能集,有时公…

HTB-OnlyForYou

HTB-OnlyForYou 信息收集立足johnjohn -> root 信息收集 Designed by BootstrapMade. 在他们的TEAM的常见问答里面发现了一个beta产品。 网站首页可以下载疑似源码的文件。 右上角还有两个功能。 一个是上传图片并调整大小。 上传了文件后会跳转到list&#xff0c;选择…