# Python的文件操作
import time
from idlelib.iomenu import encoding
from os import close
# 1.文件的编码
# 全球通用编码格式:UTF-8
# 编码是一种规则集合,记录了内容和二进制间相互转换的逻辑。
# 2.文件的读取
# 打开文件:open()
# 语法:open(name, mode, encoding)
# name为文件名(或文件具体路径)的字符串;mode为打开文件的模式;encoding为编码格式
# 常用的三种基础访问模式:r:只读;w:写入;a:追加
# w模式下会从头开始编辑,原内容被删除;如果该文件不存在则创建新文件
# a模式下会在已存在文件的内容后追加新内容;如果该文件不存在则创建新文件
"""
f = open("T:\\PY_Learning\\测试.txt","r",encoding="UTF-8") #f为特殊的数据类型,称为对象
"""
# print(type(f))
# 读操作相关方法
# read();文件对象.read(num),其中num表示从文件中读取的数据长度,单位是字节,若不传入则读取所有数据
# readline();按照行的方式把文件中第一行的内容进行读取,并返回一个列表
# readlines();按照行的方式把整个文件中的内容进行一次性读取,并返回一个列表,其中每一行的数据为一个元素
# print(f"读取10个字节的结果为:{f.read(10)}")
# print(f"读取全部字节的结果为:{f.read()}")
# 注意:连用两次read的话会出现这样的情况:上一次read的结尾会作为下一次read的开始!!!
# lines = f.readlines()
# print(f"lines的类型为:{type(lines)}\n用readlines函数读取的结果为:{lines}")
# 注意:每次使用read或readlines函数对同一个文件进行操作后,都会在读取内容的最后留下指针,这个指针会继续存在至程序结束运行
"""
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}")
"""
# 关闭文件操作:close()
# 如果不关闭,文件将一直被python程序所占用
"""
# time.sleep(50000) #单位:秒,让程序睡眠50000秒,期间文件一直被占用
f.close() #解除文件占用
"""
# with open语法,操作完成后可以自动关闭,避免遗忘掉close方法
"""
with open("T:\\PY_Learning\\测试.txt","r",encoding="UTF-8") as f:
for line in f:
print(f"每一行的数据是:{line}")
time.sleep(50000) #此时文件没有被占用,已被自动关闭
"""
# 课后练习
# 有如下文本:
"""
sean chan YL python
sean chan YL python
beijing shanghai guangzhou shenzhen
wuhan hangzhou chongqing sean
sean sean nanchang hangkong
"""
# 读取文件,统计sean单词出现的次数
# 方法1:
"""
with open("T:\\PY_Learning\\课后练习.txt","r",encoding="UTF-8") as k:
list_1 = []
i = 1
for line in k:
print(f"第{i}行的内容是:{line}")
list_1.append(line)
i += 1
str_1 = str(list_1)
print(f"sean在文本中总共出现{str_1.count("sean")}次")
"""
#方法2
"""
k = open("T:\\PY_Learning\\课后练习.txt","r",encoding="UTF-8")
count = 0
for line in k:
line = line.strip() #去除文本每一行的前后空格及换行符
words = line.split(" ") #以空格为分隔符分隔字符串并存入列表
print(f"每一行的内容是:{words}")
count += words.count("sean")
k.close()
print(f"sean单词在文本中总共出现{count}次")
"""
# 3.文件的写入操作
"""
# 打开文件
f = open("T:\\PY_Learning\\测试.txt","r",encoding="UTF-8")
# 文件写入,直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
f.write('Hello World!')
# 内容刷新,调用flush后,内容才会真正写入文件
# 这样做可避免频繁地操作硬盘,导致效率下降,所以最好攒一堆,一次写入硬盘
f.flush()
"""
"""
f = open("T:\\PY_Learning\\测试2.txt", "w", encoding="UTF-8")
f.write("Hello World!") #本来不存在测试2这个文件,此代码运行后就会新建这个文件
f.close()
f = open("T:\\PY_Learning\\测试2.txt", "w", encoding="UTF-8")
f.write("Sean Chan") #若以写入模式打开一个存在的文件,则文件原有内容会被覆盖
#f.flush()
#time.sleep(200)
f.close() #close函数已经内置了flush函数的功能
"""
# 4.文件的追加操作
# 语法:f = open("file address name", 'a', encoding = "UTF-8")
"""
f = open("T:\\PY_Learning\\测试3.txt", "w", encoding="UTF-8") #创建新文件,当然,a模式下也是可以创建新文件的
f.write("Hello World!\n") #写入内容
f.flush()
f.close()
f = open("T:\\PY_Learning\\测试3.txt", "a", encoding="UTF-8")
f.write("Sean Chan\n") #追加内容,原有内容不覆盖
f.flush()
f.close()
"""
# 5.文件操作综合案例
# 需求:有如下账单(详见文件bill.txt),请将含有‘正式’字样的条目写入到另外一个备份文件(bill.txt.bak)中保存
f = open("T:\\PY_Learning\\bill.txt", "r", encoding = "UTF-8")
k = open("T:\\PY_Learning\\bill.txt.bak", "w", encoding = "UTF-8")
# 方法1
for line in f:
if line.__contains__("测试") != True: #如果这一行含有测试字样就跳过,不写入
k.write(line)
else:
continue
# 方法2
"""
for line in f:
line = line.strip() #将每一行前后的换行符或者空格或者回车给删除掉
line.split(',') #以逗号为分隔符分隔开内容,组成一个含有数个元素的列表
if line[-1] == "测试": #如果列表最后一个元素是”测试“,则跳过一次循环
continue
k.write(line)
k.write("\n") #因为第151行strip过,所以要手动添加一次换行符
"""
f.close()
k.close()
k = open("T:\\PY_Learning\\bill.txt.bak", "r", encoding = "UTF-8") #以读模式打开备份文件
for line in k:
print(line)
k.close()
bill文件内容如下:
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,消费,正式