本文主要是介绍第五章 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这篇关于第五章 Python-文件操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!