08 Python文件
1.文件编码
-
文件分类(了解):
- 文本文件:专门存储文本字符数据。比如:txt,ppt,Excel等
- 二进制文件:不能直接使用文字处理程序正常读写,必须先了解其结构和序列化规则,再设计正确的反序列化规则,才能正确获取文件信息。比如:可执行程序exe
-
文件存储格式:
-
什么是文件编码?
- 按照一定规则,把逻辑上的内容转换成01形式的机器语言
-
有哪些文件编码?
- UTF-8
- ASCII,GBK,big5
-
什么是文件编码?
- 按照一定规则,把逻辑上的内容转换成01形式的机器语言
-
有哪些文件编码?
- UTF-8
- ASCII,GBK,big5
1.2 文件的读取
- 文件操作步骤:
- 打开文件
- 操作文件-读、写
- 关闭文件
- open(file_name,mode,encoding=“UTF-8”)
- 参数:name,
- 访问模式
- 主访问模式:(r,w,a),还有两种配合模式r和+
- 使用”r”模式,读操作注意:
- 文件如果不存在,会报错
- 编码encoding=“UTF-8”
- read()
- 带字节
- 不带字节参数
- 注意光标位置
- 注意"\n"
- readline()-一行
- readlines()–一行都是列表中的一个元素
- for line in 文件对象
- 要掌握
- 文件对象.close()
-
对比不关闭,文件被占用
-
使用sleep睡眠方法
-
- with open 方法避免遗忘关闭
"""
演示对文件的读取
"""
# 打开文件
import time
f = open("D:/测试.txt", "r", encoding="UTF-8")
print(type(f))
# 读取文件 - read()
# print(f"读取10个字节的结果:{f.read(10)}")
# print(f"read方法读取全部内容的结果是:{f.read()}")
print("-----------------------------------------------")
# 读取文件 - readLines()
# lines = f.readlines() # 读取文件的全部行,封装到列表中
# print(f"lines对象的类型:{type(lines)}")
# print(f"lines对象的内容是:{lines}")
# 读取文件 - readline()
# line1 = f.readline()
# line2 = f.readline()
# line3 = f.readline()
# print(f"第一行数据是:{line1}")
# print(f"第二行数据是:{line2}")
# print(f"第三行数据是:{line3}")
# for循环读取文件行
# for line in f:
# print(f"每一行数据是:{line}")
# # 文件的关闭
# f.close()
# time.sleep(500000)
# with open 语法操作文件
with open("D:/测试.txt", "r", encoding="UTF-8") as f:
for line in f:
print(f"每一行数据是:{line}")
time.sleep(500000)
-
练习-读取文件的4种方式:
#1 打开文件 fr = open("H:\\test.txt", "r", encoding="utf-8") #方法1:read() # print(f"读取之前的光标位置:{fr.tell()}") print(fr.read()) # print(f"读取之后的光标位置:{fr.tell()}") print("----------------") fr.seek(0, 0)#移动光标到文件开头 #方法2:readline() for i in range(1, 6): print(fr.readline(), end="") print("\n----------------") fr.seek(0, 0)#移动光标到文件开头 #方法3:readlines() for i in fr.readlines(): # print(type(i)) #strip()去掉字符串两端空格,和\n print(i.strip()) print("----------------") fr.seek(0, 0)#移动光标到文件开头 #方法4: for line in fr: print(line,end="") #3 关闭文件 fr.close()
-
课后练习-单词计数:
- 通过Windows的文本编辑器软件,将如下内容,复制并保存到:word.txt,文件可以存储在任意位置,通过文件读取操作,读取此文件,统计dashuju单词出现的次数
dashuju itcast python
dashuju python itcast
beijing shanghai dashuju
shenzhen guangzhou dashuju
wuhan hangzhou dashuju
zhengzhou bigdata dashuju
- 代码
#通过文件读取操作,读取此文件,统计dashuju单词出现的次数
#1 打开文件
fr = open("H:\\01-财税22、23年秋课程资料\\02-Python程序设计\\09 课上练习\\1班\\第7章\\word.txt","r+",encoding="utf-8")
#2 读取并统计
# 方法一:
# content = fr.read()
# # print(f"类型:{type(fr.read())}")
# print("数量有:",content.count("dashuju"))
#方法二:
# print(fr.readline())
count = 0
for i in fr:
#1 使用strip()对i去掉前后空格,以及换行符,
# print("strip后:",i.strip())
line_list = i.strip().split(" ")
for j in line_list:
if j == "dashuju":
count = count + 1
#3 关闭
print(f"dashuju单词数量为:{count}")
fr.close()
1.3 文件的写入
-
使用方法:
- "w"模式
- write()
- flush()
-
案例:
- 注意:直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
# 1. 打开文件
f = open('python.txt', 'w')
# 2.文件写入
f.write('hello world')
# 3. 内容刷新
f.flush()
- 使用”w”模式,写操作注意:
- 文件如果不存在,会创建新文件文件如果存在,
- 文件如果不存在,会将原有内容清空
- close,自带flush() 方法的功能
1.4 文件的追加文件
-
所有方法类似写入操作,类比写入记忆
- 注意事项:此模式下,文件指针在最后,无法读取数据
-
案例演示:
- a模式,文件不存在,会创建文件
- a模式,文件存在,会在最后,追加写入文件
# 1. 打开文件,通过a模式打开即可
f = open('python.txt', 'a')
# 2.文件写入
f.write('hello world')
# 3. 内容刷新
f.flush()
- 演示练习:
import time
#1
fa = open("test1.txt", "a+", encoding="utf-8")
#2
fa.write("\n22222这是追加的内容")
time.sleep(5)
fa.flush()
#3
fa.close()
1.5 操作综合案例
- 文件备份
需求:有一份账单文件,记录了消费收入的具体记录,内容如下:
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式
同学们可以将内容复制并保存为 bill.txt文件,
我们现在要做的就是:
- 读取文件
- 将文件写出到bill.txt.bak文件作为备份
- 同时,将文件内标记为测试的数据行丢弃
实现思路:
open和r模式打开一个文件对象,并读取文件
open和w模式打开另一个文件对象,用于文件写出
for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过
将2个文件对象均close()
1.6 补充
文件读写模式补充
- 补充二进制
打开模式 | 名称 | 描述 | |
---|---|---|---|
r/rb | 只读模式 | 以只读的形式打开文本文件/二进制文件,若文件不存在或无法找到,文件打开失败 | |
w/wb | 只写模式 | 以只写的形式打开文本文件/二进制文件,若文件已存在,则重写文件,否则创建新文件 | |
a/ab | 追加模式 | 以只写的形式打开文本文件/二进制文件,只允许在该文件末尾追加数据,若文件不存在,则创建新文件 | |
r+/rb+ | 读取(更新)模式 | 以读/写的形式打开文本文件/二进制文件,若文件不存在,文件打开失败 | |
w+/wb+ | 写入(更新)模式 | 以读/写的形式打开文本文件/二进制文件,若文件已存在,则重写文件 | |
a+/ab+ | 追加(更新)模式 | 以读/写的形式打开文本/二进制文件,只允许在文件末尾添加数据,若文件不存在,则创建新文件 |
文件的定位读写
-
Python提供了一些获取与修改文件读写位置的方法,以实现文件的定位读写。
-
tell():获取文件当前的读写位置。
with open('file.txt') as f: print(f.tell()) # 获取文件读写位置 print(f.read(5)) # 利用read()方法移动文件读写位置 print(f.tell()) # 再次获取文件读写位置
-
seek():控制文件的读写位置,seek()方法调用成功后会返回当前读写位置。
-
语法格式如下:
-
seek(offset, from)
-
seek(0,0) 等价seek(0)
-
offset:表示偏移量,即读写位置需要移动的字节数。
-
from:用于指定文件的读写位置,该参数的取值为0、1、2。
0:表示文件开头。
1:表示使用当前读写位置。
2:表示文件末尾。
-
with open('file.txt') as f: print(f.tell()) # 获取文件读写位置 print(f.read(5)) # 利用read()方法移动文件读写位置 print(f.tell()) # 再次获取文件读写位置 #在Python3中,若打开的是文本文件,那么seek()方法只允许相对于文件开头移动文件位置,若在参数from值为1、2的情况下对文本文件进行位移操作,将会产生错误。 with open('file.txt') as f: f.seek(5,0) # 相对文件开头移动5字节 f.seek(3,1)
-
-
2. 文件与目录管理
-
概念:os模块中定义了与文件操作相关的函数,利用这些函数可以实现删除文件、文件重命名、创建/删除目录、获取当前目录、更改默认目录与获取目录列表等操作。
-
删除文件——os.remove(文件名)
-
文件重命名——os.rename(原文件名,新文件名)
-
创建/删除目录——os.mkdir(目录名)/os.rmdir(目录名)
-
获取当前目录——os.getcwd()
-
更改默认目录——os.chdir(路径名)
-
获取目录列表——os.listdir(目录/路径)
-
-
练习1:文件备份
需求:?户输?当前?录下任意?件名,程序完成对该?件的备份功能(备份?件名为xx[备份]后缀,例
如:test[备份].txt)。-
步骤
- 接收?户输?的?件名
- 规划备份?件名
- 备份?件写?数据
-
代码实现:
- 接收?户输?的?件名
old_name = input('请输?您要备份的?件名:') 2. 规划备份?件名 2.1 提取?标?件后缀 2.2 组织备份的?件名,xx[备份]后缀 ```python # 2.1 提取?件后缀点的下标 index = old_name.rfind('.') # print(index) # 后缀中.的下标 # print(old_name[:index]) # 源?件名(?后缀) # 2.2 组织新?件名 旧?件名 + [备份] + 后缀 new_name = old_name[:index] + '[备份]' + old_name[index:] # 打印新?件名(带后缀) # print(new_name)
-
备份?件写?数据
3.1 打开源?件 和 备份?件
3.2 将源?件数据写?备份?件
3.3 关闭?件
#3 备份文件写入数据 #3.1 打开源文件和备份文件 fr_old = open(old_f, "r", encoding="utf-8") fw_new = open(new_f, "w+", encoding="utf-8") #3.2 写入新文件 while True: con = fr_old.read(1024) if len(con) == 0: break else: fw_new.write(con) #3.3关闭文件 fr_old.close() fw_new.close()
-
练习2:文件批量改名:
- 添加或删除指定字符串->“Python_原文件名”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!