《Python编程实训快速上手》第七天--文件与文件路径

 该章节将使用Python在硬盘上创建、读取和保存文件

 一、文件与文件路径

1、Windows中使用\以及macOS和Linux中使用/ 

使用pathlib模块中的Path()函数进行文件名和目录的拼接,返回文件路径字符串

from pathlib import Path
print(Path("spam","bacon","egg"))>> spam\bacon\egg

由于Path(r"spam\eggs")在Windows中表示两个单独目录,但在macOS和Linux中表示一个名为spam\eggs的目录或文件,因此,今后再写文件路径时使用正斜杠/

2、使用/连接路径

使用/组合Path对象和字符串,应注意前两个值中有一个必须是Path对象。原因在于Python从左往右求值/运算符,并求值为一个Path对象,因此只有当前两个值有一个为Path对象时整个表达式才能求值为Path对象。

好处在于无论代码在哪种操作系统上,pathlib模块都可以重新使用/正确地连接路径从而解决问题。

print(Path("spam") / "bacon" / "eggs")>> spam\bacon\eggs

3、当前工作目录 

使用Path.cwd()函数可以取得当前工作路径的字符串,并可以利用os.chdir()改变它

from pathlib import Path
import os
print(Path.cwd())
os.chdir('E:\\test')
print(Path.cwd())>> C:\Users\ROG\Desktop\pythonProject
>> E:\test

注意chdir()中是\\ 

4、主目录 

使用Path.home()查看

print(Path.home())
>> C:\Users\ROG

主目录位于一个特定位置,具体取决于操作系统

  • 在Windows中,主目录位于C:\Users下
  • 在macOS中,主目录位于/Users下
  • 在Linux中,主目录位于/home下 

5、绝对路径与相对路径 

绝对路径:从根目录开始

相对路径:相对于程序的当前工作目录

 相对路径开始处的.\是可选的。例如,.\spam.txt 和spam.txt 指的是同一个文件。 

 6、用os.makedirs()创建新目录

如果中间目录不存在,os.makedirs()会将其创建出来

也可通过Path对象先创建目录,再调用mkdir()方法

os.makedirs("C:\\Users\\ROG\\Desktop\\test.py")
Path(r"E:\Users\ROG\Desktop").mkdir()

7、处理绝对路径和相对路径

1)从相对路径中获取绝对路径

将Path.cwd() / 放在相对Path对象的前边,因为相对路径几乎总是指相对于当前工作目录的路径

print(Path.cwd() / Path("my/relative/path"))>> C:\Users\ROG\Desktop\pythonProject\my\relative\path

2) os.path模块提供的一些有用函数

  • 将相对路径转换成绝对路径:os.path.abspath(path)
  • 判断是否是绝对路径:os.path.isabs(path)
  • 返回从开始路径到path路径的相对路径:os.path.relpath(path,start)
print(os.path.abspath("."))
>> C:\Users\ROG\Desktop\pythonProjectprint(os.path.isabs(Path.cwd()))
print(os.path.isabs("."))
>> True
>> Falseprint(os.path.relpath(r"C:\Config",Path.cwd()))
>> ..\..\..\..\Config

8、取得文件路径的各部分 

驱动:drive   锚点:anchor   父文件夹:parent   文件名:name   主干名:stem   后缀名:suffix 

从文件路径中提取每个属性

p = Path("C:/Users/AI/spam.txt")

p.drive      --->   C:

p.anchor   --->   C:/

p.parent    --->   WindowsPath("C:\Users\AI")   返回为另一个Path对象

p.name     --->   spam.txt

p.stem      --->   spam

p.suffix      --->   .txt

parents属性求值为一组Path对象

p = Path("C:/Users/Al/AppData/Local/Programs/Python/Python36-32/Lib/site")
for index,path in enumerate(p.parents):print("parents[%s] = %s"%(index,path))

os.path.split(calcFilePath)获取一个路径的目录名称和基本名称的元组,calcFilePath即可为Path对象,也可为路径字符串

os.sep作为string类中的split方法里的参数用以按路径中分隔斜杠分割路径,返回每个文件夹的字符串列表。在Windows中分隔斜杠为\,在macOS和Linux中为/,用不对分割不了(如第三个print)

p = Path(r"C:\Users\Al\AppData\Local\Programs\Python\Python36-32\Lib\site")
print(os.path.split(p))
print(os.path.split(r"C:\Users\Al\AppData\Local\Programs\Python\Python36-32\Lib\site"))
print("C:/Users/Al/AppData/Local/Programs/Python/Python36-32/Lib/site".split(os.sep))
print(r"C:\Users\Al\AppData\Local\Programs\Python\Python36-32\Lib\site".split(os.sep))
print("C:\\Users\\Al\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\site".split(os.sep))

9、查看文件大小和文件夹内容

os.path.getsize(path):返回path参数中文件的字节数

os.listdir(path):返回文件名字符串的列表,包含path参数中的每个文件

print(os.path.getsize(r"D:\steam\steam.exe"))
print(os.listdir(r"D:\java"))

目录下所有文件的总字节数求法:

allDirs = os.listdir(r"D:\java")
totalSize = 0
for dir in allDirs:totalSize += os.path.getsize(os.path.join(r"D:\java",dir))
print(totalSize)

 10、使用通配符模式修改文件列表

*:多个任意字符

?:任意单个字符 

Path对象使用glob()方法根据“通配符模式”列出文件夹内容 ,再配合list()展现出来。glob()方法返回一个生成器对象。

p = Path(r"D:\attack on titan2")
print(list(p.glob("*.exe")))
print(list(p.glob("TB03_v2.0.5.0-?.bin")))

这里不会返回TB03_v2.0.5.0-10.bin,因为?只会匹配一个字符

for循环遍历glob()返回的生成器对象

p = Path(r"D:\attack on titan2")
for i in p.glob("*.bin"):print(i)

11、检查路径的有效性

p = Path("xxx")

p.exists():该路径是否存在,返回True

p.is_file():该路径存在且为一个文件,返回True

p.is_dir():该路径存在且为一个目录,返回True

二、文件读写过程

读写文件有3 个步骤:

  1. 调用open()函数,返回一个File 对象。
  2. 调用File 对象的read()或write()方法。
  3. 调用File 对象的close()方法,关闭该文件。

1、用open()函数打开文件

 open()函数中可以传递Path对象,也可传递字符串,函数将返回File对象

testFile = open(Path.cwd() / 'test.txt')
helloFile = open(".\\hello.txt")

2、读取文件内容

使用File对象的read()方法时,会将整个文件内容当成一个长字符串返回

使用readlines()方法时,从该文件取得一个字符串的列表,列表中的每个字符串就是文本中的每一行。

当前hello.txt内容

读全文:

helloFile = open(".\\hello.txt")
helloContent = helloFile.read()
print(helloContent)

分行读取:

helloFile = open(".\\hello.txt")
helloContentLine = helloFile.readlines()
print(helloContentLine)>> ['large moustache. Mrs Dursley was thin and blonde and had nearly twice the usual amount\n', 'of neck, which came in very useful as she spent so much of her time craning over garden\n', 'fences,spying on the neighbours. The Dursleys had a small son called Dudley and in their\n', 'opinion there was no finer boy anywhere.\n', '\n']

注意,每次读完后读取指针会在文章最末尾,因此想要再次读取文章内容时,要重置指针到文章开头:

helloFile.seek(0)

3、写入文件

向open()方法中传递第二个参数,默认是读模式"r":

1)写模式:"w"     2)添加模式: "a"

如果open()打开的文件名不存在,则两个模式均会创建一个新的空文件,在读取或写入文件后,调用close()方法,然后才能再次打开该文件 

helloFile = open(".\\hello.txt","w")
helloFile.write("Hello World !")
helloFile.close()
helloFile = open(".\\hello.txt","a")
helloFile.write("add contents.")
helloFile.close()

 注意,write()方法不会在字符串的末尾自动添加换行字符,必须自己添加该字符。

三、用shelve模块保存变量

shelve 模块可以将Python 程序中的变量保存到二进制的shelf 文件中。这样,程序就可以从硬盘中恢复变量的数据。

shelfFile = shelve.open("test")
cats = ['cat1', 'cat2', 'cat3']
shelfFile['cats'] = cats #将cats列表保存在shelfFile中,并作为键"cats"关联的值
shelfFile.close()

 这3个文件包含了存储在shelf中的数据

 shelf值有keys()和values()方法,返回shelf中键和值的类似列表值,不是真列表,因此要使用list()进行类型转换来取得列表形式

print(list(shelfFile.keys()))
print(list(shelfFile.values()))>> ['cats']
>> [['cat1', 'cat2', 'cat3']]

创建文件时,如果需要在文本编辑器中读取它们,纯文本就非常有用。但是,如果想要保存Python 程序中的数据,那就使用shelve 模块。

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

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

相关文章

StarRocks 架构

StarRocks 是什么?( What is StarRocks?) StarRocks 是 MPP 的查询引擎,用来做实时查询,提供亚秒级的查询性能。 兼容 MYSQL 协议,可以和大部分 BI 工具进行无缝衔接。 Apache 2.0 开源产品。 使用场景&…

A038-基于SpringBoot的乡村养老服务管理系统登录

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

WPF应用程序的生命周期-笔记

应用程序的生命周期 窗体的生命周期: window是一个控件 window中的事件:从window创建到关闭我们称之为窗体的生命周期 每一个窗体的生命周期都是独立的,窗体与窗体之间的生命周期都是独立的 最早加载的事件 控件的事件触发 基本所有的控件都继承与Framework 在WPF中基本所有的…

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式,也能支持WebS…

智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建

hello~这里是维小帮,如有项目需求和技术交流欢迎大家私聊我们!点击文章最下方获取智慧停车场方案~撒花! 随着城市化进程的加速,停车难问题日益凸显。智能停车系统作为缓解停车压力的有效手段,其核心技术与架构的构建至…

美赛优秀论文阅读--2023C题

文章目录 1.题目说明2.我对于这个题目信息的理解3.优秀论文学习3.1摘要3.2相关的算法模型 4.总结 1.题目说明 今天阅读的这个文章来自于这个2023年的这个美赛的这个C题的论文; 我们的这个题目可以到网上去找,这个还是比较容易找到的,大致就…

无人机飞手入门指南

无人机飞手入门指南旨在为初学者提供一份全面的学习路径和实践建议,帮助新手快速掌握无人机飞行技能并了解相关法规知识。以下是一份详细的入门指南: 一、了解无人机基础知识 1. 无人机构造:了解无人机的组成部分,如机身、螺旋桨…

【JavaEE初阶 — 多线程】定时器的应用及模拟实现

目录 1. 标准库中的定时器 1.1 Timer 的定义 1.2 Timer 的原理 1.3 Timer 的使用 1.4 Timer 的弊端 1.5 ScheduledExecutorService 2. 模拟实现定时器 2.1 实现定时器的步骤 2.1.1 定义类描述任务 定义类描述任务 第一种定义方法 …

AIGC----生成对抗网络(GAN)如何推动AIGC的发展

AIGC: 生成对抗网络(GAN)如何推动AIGC的发展 前言 随着人工智能领域的迅猛发展,AI生成内容(AIGC,AI Generated Content)正成为创意产业和技术领域的重要组成部分。在AIGC的核心技术中,生成对抗网络(GAN&am…

基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果

直接上代码&#xff0c;以下代码基于vue2,需要Vue3或者react可以使用国内直连GPT/Claude来帮你转换下 代码如下&#xff1a; // ScrollCardsGrid.vue <template><div class"scroll-cards-container"><!-- 左箭头 --><div v-show"showLef…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

RabbitMQ-死信队列(golang)

1、概念 死信&#xff08;Dead Letter&#xff09;&#xff0c;字面上可以理解为未被消费者成功消费的信息&#xff0c;正常来说&#xff0c;生产者将消息放入到队列中&#xff0c;消费者从队列获取消息&#xff0c;并进行处理&#xff0c;但是由于某种原因&#xff0c;队列中的…

ALSA - (高级Linux声音架构)是什么?

ALSA是Linux声音系统的核心组件&#xff0c;让用户可以精细控制声音硬件和声音进出。它通过抽象层屏蔽了硬件复杂性&#xff0c;使开发者能够专注于功能实现。这篇文章将逐步解析ALSA的基础知识&#xff0c;包括其运作原理、应用场景&#xff0c;以及如何完成一个基本配置和使用…

Ceph层次架构分析

Ceph的层次结构可以从逻辑上自下向上分为以下几个层次&#xff1a; 一、基础存储系统RADOS层 功能&#xff1a;RADOS&#xff08;Reliable Autonomic Distributed Object Store&#xff09;是Ceph的底层存储系统&#xff0c;提供了分布式存储的核心功能。它是一个完整的对象存…

在连锁零售行业中远程控制软件的应用

在连锁零售行业&#xff0c;远程控制软件正逐渐成为提高效率和降低成本的重要工具。作为零售经理&#xff0c;您可能已经注意到这种技术带来的变化。试想一下&#xff0c;无论您身在何处&#xff0c;都可以实时监控商店的运营情况&#xff0c;甚至在远离的地方解决顾客的问题。…

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

支持用户注册和登录、发布动态、点赞、评论、私信等功能的社交媒体平台创建!!!

需要整体源代码的可以在我的代码仓下载https://gitcode.com/speaking_me/social-media-platformTest.git 社交媒体平台 描述&#xff1a;社交媒体平台需要支持用户注册、发布动态、点赞、评论、私信等功能。 技术栈&#xff1a; 前端&#xff1a;React, Angular, Vue.js后端…

数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用

昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案 下图所示为T12nm A55项目的Ca…

【时间之外】IT人求职和创业应知【37】-AIGC私有化

目录 新闻一&#xff1a;2024智媒体50人成都会议暨每经20周年财经媒体峰会召开 新闻二&#xff1a;全球机器学习技术大会在北京召开 新闻三&#xff1a;区块链技术在金融领域的应用取得新突破 不知不觉的坚持了1个月&#xff0c;按照心理学概念&#xff0c;还要坚持2个月&am…

基于单片机智能温室大棚监测系统

本设计以单片机为核心的智能温室大棚监测系统&#xff0c;用于监测大棚内的温湿度、土壤湿度、CO2浓度和光照强度。该系统以STM32F103C8T6芯片为核心控制单元&#xff0c;涵盖电源、按键、NB-IoT模块、显示屏模块、空气温湿度检测、土壤湿度检测、二氧化碳检测和光敏电阻等模块…