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

news2024/11/19 18:42:34

 该章节将使用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\pythonProject

print(os.path.isabs(Path.cwd()))
print(os.path.isabs("."))
>> True
>> False

print(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.coloradmin.cn/o/2243559.html

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

相关文章

Springboot如何打包部署服务器

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

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

Python实现基础到高级:语音验证码技术详解

目录 一、语音验证码基础 1.1 语音验证码概述 1.2 Python语音验证码库 二、Python生成语音验证码 2.1 使用captcha库生成语音验证码 2.2 使用第三方语音合成服务API生成语音验证码 三、Python识别语音验证码 3.1 语音识别技术概述 3.2 使用百度语音识别API识别语音验证…

(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)

摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;企业只能以用户为导向&#xff0c;按品种分类规划&#xff0c;以产品的持续创新作为企业最重要的竞…

后端:Spring AOP原理--动态代理

文章目录 1. Spring AOP底层原理2. 代理模式3. 静态代理4. 动态代理4.1 jdk 实现动态代理4.2 cglib 实现动态代理4.3 jdk、cglib动态代理两者的区别 1. Spring AOP底层原理 创建容器 new applicationContext()&#xff1b;Spring把所有的Bean进行创建&#xff0c;进行依赖注入…

halcon3D gen_image_to_world_plane_map的图像高精度拼接技术

基于上一篇文章&#xff0c;对gen_image_to_world_plane_map有了深刻的理解 https://blog.csdn.net/Tianwen_running/article/details/143661157?fromshareblogdetail&sharetypeblogdetail&sharerId143661157&sharereferPC&sharesourceTianwen_running&s…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系 Spring 核心容器是 Spring 框架的重要组成部分&#xff0c;负责管理和组织应用程序中的对象&#xff0c;而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象&#xff0c;二者紧密相连。 Spring 的核心容器由多个模块组成&#xf…

JFlash添加自定义MCU型号

1.打开安装路径 2.在Devices里创建你想添加的MCU的文件夹并把FLM文件放入 3.Jlink目录里找到JLinkDevices.xml文件 4.修改 <!-- --><!-- G32 --><!-- --><!-- --><!-- G32F103 --><!-- --><Device><ChipIn…

Linux中系统的延迟任务及定时任务

一、延时任务 at 命令&#xff0c;即用即消 如 at 11&#xff1a;30 rm -rf /mnt/* ctrld运行 &#xff08;过一秒即可执行&#xff09; -v 使用较明显的时间格式&#xff0c;列出at调度中的任务列表 -l 可列出目前系统上面的所有该用户的at调度 -c 可以列出后面接…

通过shell脚本分析部署nginx网络服务

通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 [rootlocalhost xzy]# vim 1.sh [rootlocalhost xzy]# chmod x 1.sh [rootlocalhost xzy]# ./1.sh2.判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…

CentOS网络配置

上一篇文章&#xff1a;VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数&#xff0c;以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…

【unity小技巧】unity最全的性能优化方案分享以及如何进行性能测试(2024/11/11更新)

文章目录 前言一、性能分析软件1、Draw Call什么是Draw Call如何查看Draw Call数量 2、分析帧调试器3、Statistics统计面板 二、优化手段1、关于图集、材质、层级的处理&#xff0c;减少DrawCall2、批处理3、音乐处理4、减少沉余资源和重复资源5、渲染优化&#xff08;GPU&…

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家&#xff0c;开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发&#xff0c;另一种是效率仅次于寄存器难度相对较低的标准库开发&#xff0c;最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 &#x1f3c5;离线批处理&#xff1a;在复杂批处理任务中&#xff0c;云器Lakehouse相较Spark表现出13.31倍性能提升。 &#x1f3c5;即席查询&#xff1a;在交互式分析场景下&#xff0c;云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

Frida反调试对抗系列(四)百度加固

本文只是交流技术&#xff0c;如有侵权请联系我删除。 知识星球&#xff1a;https://t.zsxq.com/kNlj4 前言&#xff1a; 上一篇文章我们提到 我们使用github开源魔改好的frida server 但是仍然有一些厂商的server不能通过&#xff0c;那么这篇文章针对百度加固 进行快速通…