《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.rhkb.cn/news/474975.html

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

相关文章

Oracle RAC仲裁交换机的小科普

一、Oracle RAC仲裁交换机的主要功能 Oracle RAC仲裁交换机是用于Oracle Real Application Clusters(真实应用集群,简称RAC)环境中的一种网络设备。它主要用于在集群节点之间进行通信,以确保集群的高可用性和故障切换能力。以下是…

Leetcode 快乐数

算法思想: 这段代码的目的是判断一个正整数是否是 快乐数(Happy Number)。根据题目要求,快乐数定义如下: 对于一个正整数,不断将它每个位上的数字替换为这些数字平方和。重复这个过程,如果最终…

使用 Vue 和 Create-Vue 构建工程化前端项目

目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…

【MySQL实战45讲笔记】基础篇——redo log 和 binlog

系列文章 基础篇——MySQL 的基础架构 目录 系列文章1. 重要的日志模块:redo log 和 binlog1.1 redo log1.2 binlog1.3 执行器和 InnoDB 引擎内部如何执行更新语句 1. 重要的日志模块:redo log 和 binlog 前面系统的了解了一个查询语句的执行流程&…

C++ lambda(匿名函数)捕获自己

今天写算法题时无意间遇到一种情况,我的深度优先遍历函数要在函数内调用自身,如果是普通函数没什么问题,但如果是 匿名函数 的话会有一些问题,甚至问ai,ai也没打上来,上网搜了半天,才找到这个的解答,故作此文 以费契那波数列为例 // 普通函数式 int fun(int pos) {if (pos …

DAO模式

前言 DAO(Data Access Object)模式 是一种常用的设计模式,主要用于将数据访问逻辑与业务逻辑分离。它提供了一种抽象层,使得应用程序可以与不同的数据源(如数据库、文件系统等)进行交互,而无需…

mysql日志写满出现The table ‘xxxx_amazon_order’ is full

数仓发现写数据出现 SQL 错误 [1114] [HY000]: The table ‘xxxx_amazon_order’ is full 1.第一时间查看系统磁盘, 发现空间写满了 df -h因为mysql是使用docker部署的, Docker 的默认存储位置在 /var/lib/docker /var 目录默认是在根分区 (/dev/mapper/centos-root) 下的 …

【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器

本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也…

P5099 [USACO04OPEN] Cave Cows 4

P5099 [USACO04OPEN] Cave Cows 4https://www.luogu.com.cn/problem/P5099 思路: 这里的垫蹄石之间很明显是有后效性的 所以不能用dp来做 考虑宽搜 我们每次都枚举和这个垫蹄石之间x方向和z方向的距离均不超过2的垫脚石 因为都很大 我们可以使用 代码&#xf…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境,在Linux下对编译链接理解,较为简短,着重在于编译的步骤。 C的环境 在ANSI C(标准C语言)的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中,源代码…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源:https://search.jd.com 2.实现思路: (1)数据爬取 首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

【MySQL-4】表的基本查询

目录 1. 整体学习的思维导图 2. 表的创建 2.1 Create(创建) 2.1.1 插入规则 2.1.2 更新插入 2.2 Retrieve(读取) 2.2.1 创建一个实例表 2.3 select使用 2.3.1 全表查询 2.3.2 指定序列查询 2.3.3 查询表达式 2.3.3.1 为查询表达式改名字 2.3.4 查询去重 2.…

无人机航测技术算法概述!

一、核心技术 传感器技术: GPS/GLONASS:无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机:用于拍摄地面图像,通过后续图像处理生成三维模型。 激光雷达(LiDAR):通过激光扫…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作&#xff0c;先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

如何解决飞书网页文字无法复制的问题

如何解决网页文字无法复制的问题&#xff1f;特别推荐提词宝防复制文案功能&#xff01; 在日常工作和学习中&#xff0c;我们经常遇到一些网页文字无法复制的情况&#xff0c;无论是因为权限限制还是其他原因&#xff0c;手动输入内容不仅耗时费力&#xff0c;还容易出错。那…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…