永久存储:文件处理与路径处理

news2024/12/29 10:52:38
  • 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
  • 📢努力努力再努力嗷~~~✨

💡大纲

⭕如何将数据永久的存放到硬盘上

👉不要打开文件,然后直接关闭文件,会导致截断

 一、如何操作文件

f = open("FishC.txt","w")
f.write("I Love Python\n") # 返回字符串长度
f.writelines(["I Love FishC\n","I Love my wife\n"])
f.close()

f = open("FishC.txt","r+") # 以追加的模式,可读可写
f.readable() # true
f.writable() # True

for each in f:
    print(each)
    
f.read() # 读取是空字符串,因为文件指针在末尾EOF

f.tell()

f.seek(0) # 将文件指针移到开头

f.readline()
f.read()
f.write("I Love Wifi")

f.flush() # 不用关闭文档就能读取

f.truncate(29) # 截取到29
f.close()

 

二、pathlib --- 面向对象的文件系统路径

💡pathlib 是 Python3.4 之后新添加的模块,它可以让文件和路径操作变得快捷方便,完美代替 os.path 模块。

(一)模块概述

💡提供了用于表示文件系统路径的类

  • 路径类       
    • 提供纯计算操作而不涉及 I/O 的 PurePath
    • 从纯路径继承而来但提供 I/O 操作的 Path

(二)基本用法

1、导入模块

from pathlib import Path

2、访问当前目录的路径:Path.cwd()

Path.cwd() # WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small')

3、创建一个文件对象并添加文件名

p = Path('c:/Users/13601/Desktop/My_Paper/Paper_Small')
q = p / "FishC.txt"

 4、判断文件对象是不是文件夹/文件:文件对象.is_dir()/文件对象.is_file()

p.is_dir() # True
q.is_file() # True

5、判断路径是否存在:文件对象.exists()

p.exists() # True
Path("c:/404").exists() # False

 6、获取目录路径的最后一部分:文件对象.name

p.name # 'Paper_Small'
q.name # 'FishC.txt'

7、获取文件名:文件对象.stem

q.stem # 'FishC'

 8、获取文件后缀:文件对象.suffix

q.suffix # '.txt'

9、获取父级目录 :文件对象.parent

p.parent # WindowsPath('c:/Users/13601/Desktop/My_Paper')
q.parent

10、获取逻辑祖先路径构成的序列 

ps = p.parents 
for each in ps:
    print(each)
''' 
c:\Users\13601\Desktop\My_Paper
c:\Users\13601\Desktop
c:\Users\13601
c:\Users
c:\
'''

ps[0] # WindowsPath('c:/Users/13601/Desktop/My_Paper')

 11、将路径的各个组件拆分为元组:文件对象.parts

p.parts # ('c:\\', 'Users', '13601', 'Desktop', 'My_Paper', 'Paper_Small')

12、查询文件或文件夹的信息:文件对象.stat()

p.stat()

相对路径与绝对路径

13、.表示当前目录,..表示上级目录

Path("./VMD_Source") # WindowsPath('VMD_Source')
Path("../VMD— python.txt") # WindowsPath('../VMD— python.txt') 上一级目录中的

14、将相对路径转换为绝对路径:文件对象.resolve()

Path("./VMD_Source").resolve() 
# WindowsPath('C:/Users/13601/Desktop/My_Paper/Paper_Small/VMD_Source')

15、获取当前路径下所有子文件和子文件夹:文件对象.iterdir()

p.iterdir()
for each in p.iterdir():
    print(each) # 获得所有的子文件/文件夹

💡获取所有的子文件夹,并组成一个列表

[x for x in p.iterdir() if x.is_dir()]
'''
[WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/.vscode'),
 WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/All_Paper_Read'),
 WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/pyswarm'),
 WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/VMD_Source'),
 WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/__pycache__'),
 WindowsPath('c:/Users/13601/Desktop/My_Paper/Paper_Small/论文综述')]
'''

16、创建文件夹/文件

💡 在一个文件对象p后面加 / 和想要创建的文件名得到文件对象n,然后调用n.mkdir()进行创建,得到的新文件夹就是在当前目录路径下的

👉如果想要创建的文件夹已经存在,再创建的话会报错,可以设置参数exist_ok=True

👉如果想要创建的文件夹有多个虚假的父级目录也会报错,可以设置参数parents=True

n = p/"FishC"
n.mkdir()
n.mkdir(exist_ok=True) # 重复创建不会报错

n = p/"FishC/A/B/C"
n.mkdir(parents=True,exist_ok=True) 
# "C:\Users\13601\Desktop\My_Paper\Paper_Small\FishC\A\B\C" 直接创建虚假的父级目录
n = n / "FishC.txt"
f = n.open('w')
f.write("I Love FishC.")
f.close()

17、删除文件/文件夹:文件对象.unlink()/文件对象.parent.rmdir()

n.unlink() # 删除待删除文件夹里面的文件
n.parent.rmdir() # 删除n的父级文件夹

 18、查找文件:文件对象.glob(查找内容)

p = Path('.') # 访问当前目录
p.glob("*.txt") # 查找后缀为.txt的文件
list(p.glob("*.txt")) # [WindowsPath('FishC.txt')]
list(p.glob("*/*.pdf")) # 当前路径下的下一级目录中所有包含.pdf后缀的文件
list(p.glob("**/*.pdf")) # 查找当前目录以及该目录下的所有子目录

三、with语句和上下文管理器

(一)文件的打开

💡首先需要知道文件打开的通用格式是什么

with open("文件路径", "文件打开模式", encoding = "操作文件的字符编码") as f:
    "对文件进行相应的读写操作"

👉文件路径:相对路径、绝对路径

👉文件打开模式:只读、只写、追加、可读可写、二进制模式、文本模式等(后续会详细说明)

👉字符编码:utf-8(万国码)、gbk(中文编码)

👉文件对应的读写操作就涉及到相关函数了(后续详细说)

👉f 是创建的文件对象吧(我理解为文件指针,指向打开的文件)

⚠️这是使用with块的原因是,with块在执行完毕后,自动对文件进行关闭操作

1、文件路径

👉如果文件与程序不在同一文件夹中,一般需要用到绝对路径来进行访问

👉程序与文件在同一文件夹,可简化成文件名,使用相对路径

2、打开模式

⚠️打开模式可以缺省,默认为只读模式

  • "r" :只读模式,如文件不存在,报错

  • "w":覆盖写模式,如文件不存在,则创建;如文件存在,则完全覆盖原文件

  • "x":创建写模式,如文件不存在,则创建;如文件存在,报错

  • "a":追加写模式,如文件不存在,则创建;如文件存在,则在原文件后追加内容

  • "b":二进制文件模式,不能单独使用,需要配合使用如"rb","wb","ab",该模式不需指定encoding

  • "t":文本文件模式,默认值,需配合使用 如"rt","wt","at",一般省略,简写成如"r","w","a"

  • "+":与"r","w","x","a"配合使用,设置为可读可写

💡二进制文件 

# 图片:二进制文件,不需要字符编码
with open("test.jpg", "rb") as f:    
    print(len(f.readlines())) # 将每行列为列表计算长度

3、字符编码

👉万国码(utf-8):包含全世界所有国家需要用到的字符

👉中文编码(gbk):解决中文编码问题

⚠️在windows系统下,如果缺省,则默认为gbk,并且不建议缺省encoding

⚠️解码模式要匹配

(二)文件的读取

1、读取整个内容---f.read() 读取数据的长度(单位:字节)

with open("测试文件_utf.txt", "r", encoding="utf-8") as f:      
    text = f.read()                                                   
    print(text)

2、逐行进行读取---f.readline()

with open("测试文件_gbk.txt", "r", encoding="gbk") as f:     
    for i in range(3): # 读取前三行
        text = f.readline() # 每次只读取一行
        print(text) # 这种方式会有两次换行,原文一次(如果文件中有换行的话),print自带一次
        print(text, end="") # 保留原文的换行,使print()的换行不起作用

3、读入所有行,以每行为元素形成一个列表---f.readlines()

with open("测试文件_gbk.txt", "r", encoding="gbk") as f:
    text = f.readlines() # 注意每行末尾有换行符
    print(text, end="") # 使print()的换行不起作用  
'''
['临江仙·滚滚长江东逝水\n', '滚滚长江东逝水,浪花淘尽英雄。\n', '是非成败转头空。\n', '\n', '青山依旧在,几度夕阳红。\n', '白发渔樵江渚上,惯看秋月春风。\n', '一壶浊酒喜相逢。\n', '古今多少事,都付笑谈中。\n']
'''  

⭕总结

  • 文件比较大时,read()和readlines()占用内存过大,不建议使用
  • readline用起来不是很方便
  • 可以通过从迭代对象中取值的方式读取
with open("测试文件_gbk.txt", "r", encoding="gbk") as f:     
    for text in f: # f本身就是一个可迭代对象,每次迭代读取一行内容 
        print(text,end="")  

(三)文件的写入

1、向文件写入一个字符串或字节流(二进制)---f.write()

with open("测试文件.txt", "w", encoding="utf-8") as f:                      
        f.write("啦啦啦啦啦啦\n") # 如需换行,末尾加换行符\n

⚠️如果文件存在,新写入内容会覆盖掉原内容,一定要注意!!!

⚠️文件不存在则立刻创建一个

👉以追加"a" 的模式写入,在原文的末尾开始写入

with open("测试文件.txt", "a", encoding="utf-8") as f:                      
        f.write("姑娘你别哭泣\n")        
        f.write("我俩还在一起\n")        
        f.write("今天的欢乐\n")
        f.write("将是明天创痛的回忆\n")

2、将一个元素为字符串的列表整体写入文件---f.writelines()

⚠️与readlines()相对应

ls = ["春天刮着风", "秋天下着雨", "春风秋雨多少海誓山盟随风远去"] # 需要换行就加\n
with open("测试文件.txt", "w", encoding="utf-8") as f:
    f.writelines(ls)
# 春天刮着风秋天下着雨春风秋雨多少海誓山盟随风远去

(四)可读可写

💡对于文件的创建与否,仍然以未加+的打开模式为准

1、"r+"

  • 如果文件名不存在,则报错

  • 指针在开始,需要要把指针移到末尾才能开始写,否则会覆盖前面内容

⭕ 将指针移到末尾的方法

👉第一种:将文件内容全部读取一遍,这猴子那个方法很笨,不建议

for line in f:
    print(line) # 全部读一遍后,指针到达结尾

 👉第二种:可以将指针移到末尾f.seek(偏移字节数,位置(0:开始;1:当前位置;2:结尾))

with open("测试文件.txt", "r+", encoding="gbk") as f:
    f.seek(0,2) 
    text = ["啦啦啦啦啦,\n", "噜噜噜噜。\n"]
    f.writelines(text)

2、"w+"

  • 若文件不存在,则创建

  • 若文件存在,会立刻清空原内容!!!

with open("测试文件.txt", "w+", encoding="gbk") as f:
    pass # 文件存在,清空原内容

with open("测试文件.txt", "w+", encoding="gbk") as f:
    text = ["啦啦啦啦啦,\n", "噜噜噜噜。\n"]
    f.writelines(text) # 写入新内容,指针在最后
    f.seek(0,0) # 指针移到开始
    print(f.read()) # 读取内容

3、"a+"

  • 若文件不存在,则创建

  • 指针在末尾,添加新内容,不会清空原内容

with open("测试文件.txt", "a+", encoding="gbk") as f:
    f.seek(0,0) # 因为是追加的形式,所以要把指针移到开始进行读取
    print(f.read()) # 读取内容

with open("测试文件.txt", "a+", encoding="gbk") as f:
    text = ["啦啦啦啦啦,\n", "噜噜噜噜。\n"]
    f.writelines(text) # 指针在最后,追加新内容 
    f.seek(0,0) # 指针移到开始
    print(f.read()) # 读取内容

(五)数据的存储与读取(了解即可)

💡两种数据存储结构csv和json

1、csv格式

👉由逗号将数据分开的字符序列,可以由excel打开

# 读取
with open("成绩单.csv", "r", encoding="gbk") as f:
    ls = [] 
    for line in f: # 逐行读取
        ls.append(line.strip("\n").split(",")) # 去掉每行的换行符,然后用“,”进行分割
for res in ls:
    print(res)
'''
['编号', '数学成绩', '语文成绩']
['1', '100', '98']
['2', '96', '99']
['3', '97', '95']
'''

# 写入
ls = [['编号', '数学成绩', '语文成绩'], ['1', '100', '98'], ['2', '96', '99'], ['3', '97', '95']]
with open("score.csv", "w", encoding="gbk") as f: 
    for row in ls:                                  
        f.write(",".join(row)+"\n") # 用逗号组合成字符串形式,末尾加换行符

2、json格式

👉常用来存储字典类型

import json
scores = {"Petter":{"math":96 , "physics": 98},
        "Paul":{"math":92 , "physics": 99},
        "Mary":{"math":98 , "physics": 97}}

# 写入---dump()
with open("score.json", "w", encoding="utf-8") as f: # 写入整个对象 
        # indent 表示字符串换行+缩进 ensure_ascii=False 显示中文
        json.dump(scores, f, indent=4, ensure_ascii=False)  
 
# 读取---load()
with open("score.json", "r", encoding="utf-8") as f:                                         
        scores = json.load(f) # 加载整个对象
        for k,v in scores.items():
            print(k,v)
'''
Petter {'math': 96, 'physics': 98}
Paul {'math': 92, 'physics': 99}
Mary {'math': 98, 'physics': 97}
'''

(六)将python对象序列化:pickle

💡将python对象转换为二进制字节流

import pickle

x,y,z = 1,2,3
s = "FishC"
l = ["小甲鱼",520,3.14]
d = {"one":1,"two":2}

with open("data.pkl",'wb') as f:
    pickle.dump((x,y,z,s,l,d),f)
import pickle

with open("data.pkl",'rb') as f:
    x,y,z,s,l,d = pickle.load(f)

print(x,y,z,s,l,d,sep='\n')

 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

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

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

相关文章

OneNote支持Markdown:高亮代码

文章目录 结论在前效果安装日常工作流(高亮代码块) 结论在前 markdown对我来说是伪需求,真正需要的是高亮代码,通过Github/NoteHighlight2016这个开源插件可实现这个插件虽然叫2016,但实测onenote 2013也是可以用的 效…

华为OD机试之数组去重和排序(Java源码)

数组去重和排序 题目描述 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。 输入描述 一个数组 输出描述 去重排序后的数组…

使用微信怎么图片投票怎么设置qq里面投票是如何

手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。 现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工作效率,提高活动的影响力。 那么微信做投票的小程序哪个比较…

苹果头显Vision Pro深度解读2 软件开发者谁最受益?

1 软件开发者谁最受益? 开发Vision pro这种设备的软件啊,首先得跟vision pro本身的特点结合起来,比如它本质上并不是一个很适合移动的的设备。用户大多数时候,都是坐着,站着,躺着使用。 所以典型的应用场…

【Linux】文件描述符与重定向操作

系列文章 收录于【Linux】文件系统 专栏 对于Linux下文件的写入与读取,以及文件原理还有疑惑的可以看看上一篇文章浅谈文件原理与操作。 目录 系列文章 再谈文件描述符 ​编辑 IO函数的本质 一切皆文件 文件重定向 原理 系统接口 再谈文件描述符 &#x…

C语言 指针(特别篇)

本篇目录 C语言 指针(特别篇)内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &(Address-of Operator)C语言中的 * 号运算符示例集:指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…

doris docker部署 1.2.4.1版本

目录 写在前面 镜像编译 准备工作 下载编译好的包 fe be 编辑初始化文件 fe be 编辑Dockerfile fe be 构建镜像 fe be 构建结果 镜像运行 fe be 修改配置 添加udf依赖 启动be 注册be 错误分析 写在前面 以下操作语句按顺序执行即可,如果需要…

泛型Generic

泛型 1. 介绍1.1 使用泛型的好处 2. 自定义泛型结构:泛型类、泛型接口;泛型方法2.1 泛型类、泛型接口2.2 泛型方法 3. 其他3.1 泛型在继承方面的体现3.2 通配符使用3.2.1 有限制的通配符 1. 介绍 把元素的类型设计成一个参数,这个类型参数叫…

数组6大排序算法

快速排序 核心算法: 1.取一个基准值(一般是数组中间的元素),遍历数组,比基准值大的放右边,小的放左边,相等的则不动 2.分别创建三个数组来存储元素,最后将三个数组拼接起来 3.循…

Java替换Jar文件中的class文件方法

备份源文件 文件不重要的话可以不需要备份,线上环境务必备份方便回滚 mkdir bak cp test.jar bak 查看class文件所在目录 jar -tvf test.jar | grep Time.class 标红内容就是需要替换的class文件,如果有多个文件需要替换依次执行2,3步骤…

webSocket实时通信02——基于Spring【纯后端——JAVA】

这里是基于Spring整合websoket后来实现的实时通信&#xff0c;这里只有java的代码&#xff0c;通过在线网站 http://www.websocket-test.com/测试即可 1. 导包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

网络安全合规-职业发展路线

网络安全人才一将难求&#xff0c;缺口高达 95% 在以前&#xff0c;很多政企单位在进行 IT 部门及岗位划分时&#xff0c;只有研发和运维部门&#xff0c;安全人员直接归属到基础运维部&#xff1b;而现在&#xff0c;越来越多单位为了满足国家安全法律法规的要求&#xff0c;…

终极攻略!如何彻底防止Selenium被检测!

在使用Selenium进行爬虫时&#xff0c;许多朋友都会遇到各种反爬措施。 实际上&#xff0c;在绝大多数情况下&#xff0c;网站轻而易举地能够检测出你正在使用WebDriver而非标准浏览器。 本文将详细介绍如何有效防止检测的方法。 在一篇公众号文章《别去送死了。Selenium 与…

【重磅】智能未来 —— 人工智能与城乡规划的交叉对话(CSDN深圳城市开发者社区首场线下技术交流活动)

文章目录 活动主题活动海报活动时间活动地点互动有礼加入有礼赠书简介特别说明 活动主题 智能未来-人工智能与城乡规划的交叉对话 —— 以 AI 为核心主题&#xff0c;探索 AI 在 智慧城市、智能视频、智能编程 等重点领域的技术发展和实战落地。 活动海报 活动时间 2023.06…

加密与解密 调试篇 动态调试技术 (五)-WinDbg

windbg主要厉害的地方是在他可以对内核调试 并且本身微软的产品 对windows调试适配度够高 注意 windbg给出的图形操作并不好用 主要是使用命令行来进行操作 我们省略安装 直接进入调试 file 可以打开软件 可以附加也可以分析dump文件还可以进行内核和 远程调试内核调试分为…

招商基金资深架构师教你如何搭建统一监控平台

随着数字化进程的加速和业务的高速发展&#xff0c;系统的复杂程度日益升级&#xff0c;为确保业务系统的连续性和稳定性&#xff0c;越来越多的企业想要建设统一的监控平台&#xff0c;但却不知道从哪里开始着手。比如&#xff1a; 有些企业会直接将监控系统页面集成到统一监…

SpringBoot配置文件application.yml的理解

一、存放位置分类 1.当前项目根目录下的config目录下 2.当前项目的根目录下 3.resources目录下的config目录下 4.resources目录下 按照这上面的顺序&#xff0c;4个配置文件的优先级依次降低。 二、自定义存放位置和自定义命名 自定义存放位置和自定义配置文件命令和appl…

Python从Excel读取数据并使用Matplotlib绘制成二维图像

本课程实现使用 Python 从 Excel 读取数据&#xff0c;并使用 Matplotlib 绘制成二维图像。这一过程中&#xff0c;将通过一系列操作来美化图像&#xff0c;最终得到一个可以出版级别的图像。本课程对于需要书写实验报告&#xff0c;学位论文&#xff0c;发表文章&#xff0c;做…

Vue中的虚拟Dom,diff算法,以及diff的优化

virtual dom&#xff1a; 关键词&#xff1a; 1、 template 2、渲染函数 3、 vnode(virtual dom) 4、patch(diff算法) 5、view Vue.js通过编译将template 模板转换成渲染函数(render ) &#xff0c;执行渲染函数就可以得到一个虚拟节点树 VNode 虚拟节点&#xff1a;它可以代…

C++ 中的新成员

C 中的动态内存分配 C 中通过 new 关键字进行动态内存申请 C 中的动态内存申请是基于类型进行的 delete 关键字用于内存释放 new 关键字和 malloc 函数的区别 new 关键字是 C 的一部分 malloc 是由 C 库提供的函数 new 以具体类型为单位进行内存分配 malloc 以字节为单位…