第五章 Python-文件操作

2024-05-26 02:20
文章标签 python 第五章 操作

本文主要是介绍第五章 Python-文件操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第五章 初始文件操作

5.1文件类型

5.1.1 文本文件

  • 文字和二进制根据不同的编码模式存在不同的对应关系
name = "张三"
data = name.encode('utf-8')  # 将字符串转换为utf-8编码的字节类型
print(data)
data_new = data.decode('utf-8')  # 将字节类型转换为utf-8编码的字符类型
print(data_new)

b’\xe5\xbc\xa0\xe4\xb8\x89’
张三

5.1.2 图片/视频文件

  • 对于图片和视频文件来讲,本质就是由武术个像素点来组成,而每个像素点都是用二进制来表示,因此不存在图片,视频对应的编码模式,所以在读取图片和视频文件时,本质就是读取最原始的二进制。
name = "张三"
f = open("1.png", "rb")
res = f.read()
print(res)

b’\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x0b\x00\x00\x01t\x08\x06\x00\x00\x00\xad\xc…

5.2 读文件

f = open("user.txt", "rb")  # "rb"表示以只读方式打开文件,并且读取二进制内容。
content = f.read()  # 显示结果以字节的形式出现,需要对内容进行解码。
print(content)
content1 = content.decode('utf-8')  # 将文件内容进行解码。
print("以下是文件中的内容:\n{}".format(content1))
f.close()

b’name\xef\xbc\x9azhangsan\r\nage\xef\xbc\x9a18\r\nmate\xef\xbc\x9aman’
以下是文件中的内容:
name:zhangsan
age:18
mate:man

5.2.1 绝对路径和相对路径

  • 在执行Python文件时,需要注意当前的目录,如果使用相对路径的话,需要保障操作的文件在当前目录下,而如果使用绝对路径的话,则不存在这样的问题。

  • 相对路径:

    • 与当前执行的py文件在同一个目录下,可以直接使用相对路径来打开文件。
f = open("files\\test.txt", "rb")  # 采用\将第二个\进行转义,表示第二个斜杠不是特别意义,是路径中的信息。此处路径为"files\test.txt"
res = f.read()
print(res)
f.close()
f = open(r"files\test.txt", "rb")  # 在字符串前面加上r表示后续都是字符串内容,没有特别字符,如果不加r,\t有特殊意义
res = f.read()
print(res)
f.close()
  • 绝对路径
    • 如果使用绝对路径的话,在任何地方执行py文件都不会出现问题。
f = open(r"C:\Users\Michael\Desktop\1.txt", "rb")  # 不加转移字符r,则users和\1存在特殊意义,加r则后续都为字符串,表示路径
res = f.read().decode('utf-8')
print(res)
f.close()

本文件存放在桌面上

  • 转义字符
    • 方式一:r"files\test.txt"
    • 方式二:“files\\test.txt”
  • 判断文件是否存在
    • 正常情况下用rb或者rt模式来打开文件时,只能打开已经存在的文件,如果文件不存在则会报错,那么为了避免这种报错,我们在打开一个文件之前可以先进行判断。
import os  # OS模块是用于处理文件路径相关的模块path = "test.txt"
if os.path.exists(path):f = open(path, "rb")res = f.read()print(res)f.close()
else:print("文件不存在")

b’hello boss’

5.3 写文件

5.3.1 写文本文件

path = "test.txt"
# 以W模式打开问价,只能是只写的方式,如果文件不存在,则创建文件,但是如果文件存在,则会先情况文件中原本的内容
f = open(path, "wt", encoding="utf-8")   # 三个参数{路径,读取写入参数,加码参数}
f.write("哈哈")
f.close()
import os  # OS模块是用于处理文件路径相关的模块path = "test.txt"  # 实际该文件存在,文件的内容为:123213esafda
if os.path.exists(path):  # 如果该路径存在,则执行下一行语句,只读方式打开操作,否则执行else语句f = open(path, "rt",encoding="utf-8")res = f.read()print(res)f.close()
else:
# 以W模式打开问价,只能是只写的方式,如果文件不存在,则创建文件,但是如果文件存在,则会先情况文件中原本的内容f = open(path, "wt", encoding="utf-8")  # 执行只写方式,打开文件f.write("哈哈")f.close()

123213esafda

5.3.2 写图片等类型文件

  • 图片是由无数个二进制的像素点组成的,因此在操作图片文件的时候不用考虑编码,采用“b”的方式。
    • 结果新产生一个图片2.jpg,复制与原有文件1.png
f = open("1.png", "rb")
content = f.read()
print(content)
f.close()
f_object = open("2.jpg", "wb")
f_object.write(content)
f_object.close()

5.4 文件打开模式

  • r

    以只读的方式打开文件,如果文件不存在,则会报错。打开文件时,光标移动到开头

  • w

    以只写的方式打开文件,如果文件不存在则会创建新的文件,如果文件存在,则会清空原本的内容。光标移动到开头

  • a

    以追加的方式打开文件,如果文件不存在,则会创建新的文件,如果文件存在,也不会情况原本的内容,而是将指针(光标)移动到末尾接着。光标移动到末尾。

f = open("test.txt", "a", encoding="utf-8")
f.write("我在最后")
f.close()

文件的内容如下:

123213esafda我在最后

  • x

    以创建的方式打开文件,如果文件不存在,则会创建新的文件,如果文件存在,则会报错。打开后可写不可读。

  • b

    以字节的方式打开文件,写入和读取都是二进制的内容。

  • t

    以文本的方式打开文件,==默认==是以t的方式打开文件,此时需要考虑encoding参数,保证加解码采用的编码方式已知,否则就很有可能出现乱码的情况。

    以可读可写的方式打开文件

f = open("test.txt", "r+", encoding="utf-8")
print(f.read())
f.write("我在最后")
f.close()

ABC

5.5 常见方法

5.5.1 读写方法

  • read()

    读取文本中的内容,默认读取全部内容,如果想要读取部分内容,可以添加相应参数。如果是以“b”的方式打开文件,默认是以字节的方式读取,如果是以“t“的方式打开文件,则默认是以字符的方式来读取。

  • readline()

    读取文本,每次读一行,光标也随之移动,如果移动到末尾,旧不会在读取到内容,如果还想读取原本的内容,则需要改变光标的位置。

f = open("test.txt", "r+", encoding="utf-8")
print(f.readline())
print(f.readline())
print(f.readline())
f.close()

你好!

当生活欺骗了你,请不要悲伤,不要心急。

相信美好的未来即将到来。

f = open("test.txt", "r+", encoding="utf-8")
print(f.readline())
print(f.readline())
print(f.readline())
f.seek(0)  # 光标回到0点
print(f.readline())
f.close()

你好!

当生活欺骗了你,请不要悲伤,不要心急。

相信美好的未来即将到来。
你好!

  • readlines()

    读取文本中的内容,每次读取一行,会将每一行的内容当初一个元素添加到列表当中,最后会返回出一个列表。

f = open("test.txt", "r+", encoding="utf-8")
res = f.readlines()
f.close()
print(res)

[‘你好!\n’, ‘当生活欺骗了你,请不要悲伤,不要心急。\n’, ‘相信美好的未来即将到来。’]

  • write()

    向文本写入内容,在写入的时候,需要注意光标的位置。

5.5.2 移动光标位置

  • seek()

    移动的是字节,如果采用utf-8编码,一个中文汉字等于三个字节,对于中文字符,如果移动的不是三个字节的倍数,则可能会导致报错或者乱码,对于“a”模式而言移动光标无效,只会在结尾向后追加内容

f = open("test.txt", "r+", encoding="utf-8")
f.seek(3)  # 将光标移动到3字节的位置
print(f.tell())
f.close()

3

  • read()

    如果打开模式为t读取的是字符,打开模式为b读取的是字符。

f = open("test.txt", "r+", encoding="utf-8")
f.seek(1)  # 将光标移动到1字节的位置,结果报错
res = f.read()
print(f.tell())
f.close()
print(res)

输出结果:报错

f = open("test.txt", "r+", encoding="utf-8")
f.seek(3)  # 将光标移动到3字节的位置
res = f.read(1)  # 读取一个字符的内容,由于读取前光标已经移动到了3的位置,因此读取文件中的第二个汉字“好”
print(f.tell())
f.close()
print(res)

6

f = open("test.txt", "r+", encoding="utf-8")
f.seek(2)  # 将光标移动到2字节的位置,虽然有输出结果,但是文件中出现乱码
f.write("天高皇帝远")
print(f.tell())
f.close()

17

  • 对于“a”模式而言移动光标无效,只会在结尾向后追加内容
with open("test.txt", "a+", encoding="utf-8") as f:print(f.tell())f.write("可以写进去吗")print("写完后光标位置", f.tell())f.seek(0)f.write("你好")print(f.tell())

0
写完后光标位置 18
24

5.5.3 查看光标位置

  • tell()

    查看光标的位置,以字节为单位。

f = open("test.txt", "r+", encoding="utf-8")
data = f.read(4)
print(data)
print(f.tell())
f.close()

你好!

11

5.5.4 将写入的内容强制刷进硬盘

  • flush()
>>> f = open("test.txt", "r+", encoding="utf-8")
>>> f.write("可以写进去吗")
# 通过终端的方式,执行了写入,但是,文件中还没有该语句。需要执行flush
>>> f.flush()  # 执行flush将写入内容存入硬盘中

5.6 with上下文管理

在进行文件操作时,结束操作需要动手f.close关闭文件,避免文件一直占用内存资源,这样的方式很繁琐,针对该问题,使用With上下文管理的方式打开文件。with上下文管理的子代码块运行完成之后,默认会自动的关闭文件。

with open("test.txt", "w", encoding="utf-8") as f:f.write("可以写进去吗")

结果:文件添加了“可以写进去吗”

  • with上下文管理打开多个文件
with open("test.txt", "w", encoding="utf-8") as f1,open("test1.txt", "w+", encoding="utf-8") as f2:f1.write("可以写进去吗")f2.write("写f2")

5.7 文件内容替换

5.7.1 方式一

  • 将整个文件提取到内存中读取,然后使用replace方法进行替换(置适合小文件,不适合大文件)
with open("test.txt", "r+", encoding="utf-8") as f:content = f.read()print(content)res = content.replace("王二", "翠花")with open("test.txt", "w+", encoding="utf-8") as f1:f1.write(res)f1.flush()with open("test.txt", "r+", encoding="utf-8") as f2:print(f2.read())

假如生活欺骗了你
请不要心急,
相信美好的未来在等着你
致 王二

假如生活欺骗了你
请不要心急,
相信美好的未来在等着你
致 翠花

with open("test.txt", "r+", encoding="utf-8") as f:content = f.read()print(content)res = content.replace("王二", "翠花")f.seek(0)f.write(res)  # 推荐上一个例子,重新打开一个文件写入,本例没有打开文件,或可能覆盖“王二”后的字段
with open("test.txt", "r", encoding="utf-8") as f1:print(f1.read())

假如生活欺骗了你
请不要心急,
相信美好的未来在等着你
致 王二

假如生活欺骗了你
请不要心急,
相信美好的未来在等着你
致 翠花

5.7.2 方式二

  • 逐行读取,边读边写(适合大文件,也适合小文件)
with open("test.txt", "r+", encoding="utf-8") as f, open("new.txt", "w", encoding="utf-8") as f2:for line in f:res = line.replace("王二", "翠花")f2.write(res)f2.flush()with open("new.txt", "r+", encoding="utf-8") as f3:print(f3.read())

你好!
假如生活欺骗了你,
不要心急,
相信美好的未来即将来临!
致 翠花

5.8 CSV格式文件

5.8.1 CSV格式文件

逗号分隔符(comma-Separated Values,CSV,有时也称为字符分隔符,因为分隔符也可以不是逗号),其文件以纯文本的形式存储表格数据(数字和文本)。

对于以下这种格式的数据,我们需要利用open函数来读取文件并根据逗号或者其他符号分隔的特点来处理。

姓名,年龄,学号

张三,18,123456

李四,19,123411

王二,19,532421

import osif not os.path.exists("files"):os.mkdir("files")  # 如果不存在该目录,则创建目录,相对路径。
with open("info.csv", "r", encoding="utf-8") as f:f.readline()  # 移动光标到第二行for line in f:res = line.strip().split(",")  # 去空格、换行符后,按照“,”号分割字符串,res是集合print(res)name, age, student_id = res  # 分别使用三变量接收集合的元素,并在后续语句中创建文件,逐行的内容写入新文件。每个用户一个文件。with open(r"files\{}.txt".format(name), "w", encoding="utf-8") as f_object:f_object.write("{}-{}-{}\n".format(name, age, student_id))

输出结果是print的输出结果,文件创建后的内容需要再文件存储中查看

[‘张三’, ‘18’, ‘123456’]
[‘李四’, ‘19’, ‘123411’]
[‘王二’, ‘19’, ‘532421’]

5.9 XML格式文件

可扩展标记语言是一种简单的数据存储语言XML被设计用来传输和存储数据。

  • 存储:可用来存放配置文件,例如:java的配置文件
  • 传输,网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等
  • netconf协议基于XML
<config><ethernet xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"><ethernetIfs><ethernetIf operation="merge"><ifname>10GE1/0/14</ifname><l2Enable>disable</l2Enable></ethernetIf></ethernetIfs></ethernet><ifm xmlns="http://www.hauwei.com/netconf/vrp" content-version="1.0" format-version="1.0"><interfaces><interface operation="merge"><ifName>Loopback30</ifName><ifDescr>Config By NETCONF</ifDescr><ifmAm4><am4CfgAddr Operation="Create"><subnetMask>255.255.255.0</subnetMask><addType>main</addType><ifIpAddr>10.1.100.10</ifIpAddr></am4CfgAddr></ifmAm4></interface></interfaces></ifm>
</config>

5.9.1 XML基础

1. XML简介
<?xml version="1.0" encoding="utf-8"> 一个完整的XML文档往往以XML声明来表述文档中的一些基本信息,其中version代表版本,encoding代表编码模式 ```xml 10GE1/0/14 disable ``` - XML 文件通过标签来封装想要存储和传递的信息,在上述文件中等标签必须成对出现,由开始标签就要有结束标签。 - 开始标签: - 结束标签: - XML不会做任何事情 - XML被设计出来就是用来结构化的存储以及传输信息。 - 在XML消息中可以包含发送者和接受者的消息,同时拥有标题以及消息主题。但是这个XML文档依然没有做任何事情,他仅是包装在XML标签中的纯粹信息,我们需要编写软件或者程序,才能发送、接收和显示这个文档 - XML可以根据需求自定义标签 - XML非常自由,没有预定义的标签,使用者可以根据自己需求来定义标签,这也是为什么XML文档非常适合用来存储和传输数据。 #### 2. XML结构 在上面的XML文档中,就是根标签,从根标签一般可以看出该XML文档的类型,之后的等都是描述根的子元素。 ```xml Everyday Italian Giada De Laurentiis 2005 30.000 houzhe Yuhua 1994 10.00 ``` #### 3. XML语法规则 - XML文档必须要有根元素 - 由于XML是一个树形结构,其他的节点也需要基于根节点进行扩展和延伸 - XML声明 - XML声明文件并非一定要存在,如果需要声明的话要放在文档的第一行 - 所有XML文档的标签都是成对的,也就是素有的XML元素都必须有一个起始的标签和一个关闭的标签,省略起始标签和技术标签都是非法的。可以有以下两种方式: ```xml 这是一个标准的标签对,开始标签和结束标签

这篇关于第五章 Python-文件操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003287

相关文章

2.2 利用MyBatis实现CRUD操作

MyBatis 是一个半自动的持久层框架,它简化了数据库操作,允许开发者通过 XML 或注解的方式来配置 SQL 语句,实现数据的增删改查(CRUD)操作。 1. 环境搭建 引入依赖:在项目中添加 MyBatis 以及数据库驱动的依赖。配置数据源:通过 XML 或 Java 配置类配置数据库连接。 2. 定义数据模型 创建实体类(例如 User),其属性应与数据库表的列相对应。 3.

计网笔记-第五章:数据链路层

第五章复习重点 奇偶校验(一比特 & 二维)校验和CRCALOHA效率的计算CSMAMAC(比较IP地址和MAC地址的不同)发送数据报到子网以外的例子泛洪和自学习交换机和路由器(个人感觉还是有可能考吧)VLAN逛淘宝的Web历程(综合应用) 第五章复习大纲 理解链路层服务的主要功能 差错检查、纠错共享广播信道:多点接入问题链路层寻址局域网技术:Ethernet、VLANS 链路层技术的实现

【秋招突围】2024届秋招笔试-小红书笔试题-第一套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📧 清隆这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注CSDN同名公主号领取,会在飞书进行同步的跟新。 文章目录 📖 写在前面夏天要来了 秋招还会远吗? 🌲 01.

Python编程语言学习高阶:解决在 Python 项目中跨目录导入模块的问题的多种方法教程实战及其优劣对比

Python编程语言学习高阶:解决在 Python 项目中跨目录导入模块的问题的多种方法教程实战及其优劣对比 目录 解决在 Python 项目中跨目录导入模块的问题的多种方法教程实战及其优劣对比 T1、修改 sys.path:适用于简单的脚本开发和调试,灵活但不适合大规模项目 实现代码 T2、使用相对导入:适用于规范化的包管理和大规模项目,但需要符合包的结构要求 实现代码 项

python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg=671815,现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据,将数据保存在本地以后使用不用高频率访问tushare数据接口,访问频率限制影响不大。 >>> data = pro.stock_basic(fields='ts_cod

python_numpy的矩阵运算及对应的matlab写法

背景: NumPy和Matlab不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,可以调用相应的函数对数组进行矩阵运算。或者使用numpy库提供了的matrix类,用matrix类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,用法和matlab十分类似。不过一般用户很容易将NumPy中同时存在的ndarray和matrix对象弄混,一般不建议在大程序中使用。下面简单介绍pyth

C读取python结构数组

背景: 将python—numpy的结构数组保存到本地,然后用c将数据读取出来。 可能用到的知识: 在C语言中通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地在此基础上定义结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,两者就可以很容易的读取对方结构数组

python批量下载网页图片及列表

背景: 放假在家里没事鼓捣了一个用python实现的简单网页信息抓取的程序。 demo功能: 将千图网的商业海报http://www.58pic.com/topic/419-1.html的(海报名字 ,海报详情页面地址,海报缩略图地址)通过正则匹配提取出来,然后写入到filed='python_load_demo.txt'中,然后把第一个海报缩略图下载到文件夹imgpath = "pytho

python保存文件后打不开的原因是什么

引入数据集,奇怪的是怎么也打不开,显示不存在这个文件: 但是,我将文件改个名字,就打开了,难道csv的文件命名必须有一定合法性? import pandasusers = pandas.read_csv("H:\python\data analysis\countries.csv") 尝试 由此,我试了几个别的名字,直到我尝试了u开头的。 原因 终于明白了,因为写路

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第84讲。 逢3必过报数游戏,本题是2022年4月17日举办的第13届蓝桥杯青少组Python编程省赛真题编程部分第4题,13届一共举办了两次省赛,这是第一次省赛。题目要求编程计算N个小朋友在玩报