###文件
'''
1. 什麽是文件
文件是操作系統為用戶/应用程序提供一種操作硬盤的虚拟单位
2. 爲何要用文件
为了存取硬盘数据
3. 如何用文件
#1. 打開文件
#2. 读写文件
#3. 关闭文件##回收操作系统资源
'''
# f=open(r'C:UsersDELLDesktopa.txt',mode='r',encoding='utf-8')
# #打开一个文件,后面跟文件的地址,mode等于r表示只读方式,
# #小写的r表示后面的字符串没有特别的含义
# data=f.read()
# print(data)
# print(f)
# f.close() # 回收操作系統資源
# with open('a.txt',mode='r',encoding='utf-8') as f1,
# open('b.txt',mode='r',encoding='utf-8') as f2:
# ####以后打开文件用这种格式
# print(f1.read())
# print(f2.read())
#文件的打开模式
#一:介紹
#控制文件操作方法的模式:
#r:只读模式(默认的)
#w:只写模式
#a:只追加写(只能在最后面加 不能在前面或者中间写)
#r:只读模式,当文件存在时文件指針在文件開頭,当文件不存在時會报错
# with open('szp.txt',mode='rt',encoding='utf-8') as f:
# print(f.readable())
# data=f.read()
# print(data)
# print(f.writable())
# f.write('xxxxx')
#
# res1=f.read()
# print('first: ',res1)
#
# print(f.readline())
# print(f.readline())
# l=[]
# for line in f:
# # print(line)
# l.append(line)
# print(l)
# lines=f.readlines()
# print(lines)
# with open('aaa.txt', mode='rt', encoding='utf-8') as f:
# res2 = f.read()
# print('second: ', res2)
#w:只写模式,当文件存在時将文件清空文件指针在文件开头,儅文件不存在時會创建空文档
# with open('SZP123.txt', mode='wt', encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# # f.read()
# #
# # # 强调:在文件打开了没有关闭的情况下连续写入,新写入的内容总是紧跟在前一段内容之后
# f.write('你好啊哈哈哈
')
# f.write('大家好哈哈哈')
# f.write('1111
2222
333
')
#a:只追写模式,当文件存在時文件指针直接跳到文件末尾,儅文件不存在時會创建空文档
# with open('b.txt',mode='at',encoding='utf-8') as f:
# # print(f.readable())
# # print(f.writable())
#
## 注意:与w模式的异同:
##相同点:在文件打开了没有关闭的情况下,连续的写入,新写入的内容总是紧跟在前一段内容之后
##不同点:w模式在文件关闭又重新打开的情况下,文件会被清空,文件指针跑到文件开头,而a模式无
# 论何时打开文件,文件指针总是直接跳到文件末尾
#所以一般用a模式比较好,也就是mode=at 这样可以之前写的内容不会被清除
#在b下rwa的使用
# with open('SZP123.txt',mode='rb') as f:
# data=f.read()
# print(data,type(data))
####在模式b下也可以读取一张图片,不过前提是要这张图片存在这个路径下面,如果不存在会报错,
#之前的那个模式一个文件如果存在会被清空,不存在会自动创建一个新的空文件
# with open('123.jpg',mode='rb') as f:
# data=f.read()
# print(data,type(data))
# with open('e.txt',mode='wb') as f:
# f.write('你好啊 我叫孙志平 来自同济大学
'.encode('utf-8'))
#以上这个模式每次运行的结果都次运行都会覆盖掉前面一次运行的结果
# with open('e.txt',mode='ab') as f:
# f.write('我好啊
'.encode('utf-8'))
#控制文件操作内容格式的模式:(不能单独使用,必須跟rwa連用)
#t(默認的):无论读写都是以字符串str为單位的,只能用于文本文件,并且必須指定encoding參數
#b:无论读写都是以二進制bytes為單位的,適用於所有文件,一定不能指定encoding參數
#二:示範
# f=open('123.jpg',mode='rt',encoding='utf-8')
# data=f.read()
# # print(data,type(data))
# f.close()
# f=open('a.txt',mode='rb')
# data=f.read()
# # print(data,type(data))
# print(data.decode('utf-8'))
# f.close()
# 小练习
# src_file=input('请输入源文件路径: ').strip() #src_file='D:周末三期day04123.jpg'
# dst_file=input('请输入目标文件路径: ').strip()
# with open(r'%s' %src_file,mode='rb') as f1,open(r'%s' %dst_file,mode='wb') as f2:
# # data=f1.read()
# # f2.write(data)
#
# for line in f1:
# # print(line)
# f2.write(line)
# 了解:+
# with open('e.txt',mode='r+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())
# # print(f.read())
# f.write('1111')
#文件内指针的移动
#只有t模式下的read(n)中n代表读取的字符个数,除此外文件内指针的移动都是以bytes为单位
# with open('e.txt',mode='rt',encoding='utf-8') as f:
# data=f.read(4)
# print(data)
# with open('e.txt',mode='rb') as f:
# data=f.read(6)
# print(data.decode('utf-8'))
# with open('e.txt',mode='r+',encoding='utf-8') as f:
# f.truncate(3)
# 主动控制文件内指针的移动
#f.seek(参数1,参数2)
#参数1: 控制的移动的字节个数
#参数2: 控制参照的位置
# 0(默认的):参照文件开头
# 1:参照指针当前所在位置
# 2:参照指针文件末尾
# 强调:只有0模式可以在t下使用,1和2模式只能在b模式下使用
# with open('e.txt',mode='rt',encoding='utf-8') as f:
# a=f.seek(3,0)###第一个参数表示开始的位置,
# print(a)
# print(f.read())
# with open('e.txt',mode='rb') as f:
# # f.seek(6,0)
# # f.read(3)
# # f.seek(3,1)
# # print(f.tell())
# # print(f.read().decode('utf-8'))
#
# # f.seek(-8,2)
# # print(f.read().decode('utf-8'))
#
# f.seek(0,2)
# print(f.tell())
#小练习:tail -f access.log
# with open('access.log','rb') as f:
# f.seek(0,2)
# while True:
# line=f.readline()
# if len(line) == 0:
# #没有值
# pass
# else:
# print(line.decode('utf-8'),end='')
#文件修改的两种方式:
#结论:硬盘空间都是用新内容覆盖旧内容,不可更改,而内存空间是可以修改的
#之前的操作都是直接覆盖原文件,这个可以在原文件的基础上进行修改
# with open('e.txt',mode='r+t',encoding='utf-8') as f:
# f.seek(3,0)
# f.write('111111111111')
# 文件修改的方式一:
# 思路:
# 1. 将文件内容全部读入内存
# 2. 在内存中完成修改
# 3. 将修改的结果写回原文件
# 优点:在文件修改期间硬盘上就一份数据
# 缺点:会过多地占用内存
# with open('e.txt',mode='rt',encoding='utf-8') as f:
# data=f.read()
# data=data.replace('alex','dsb')
#
# with open('e.txt',mode='wt',encoding='utf-8') as f:
# f.write(data)
# 文件修改的方式二:
# 思路:
# 1. 以读的方式打开源文件,以写的方式打开一个临时文件
# 2. 从源文件中读取一行内容,修改完后再写入临时文件,循环往复直到源文件全部读完
# 3. 删掉源文件,将临时文件重命名为源文件名
# 优点:不会过多地占用内存
# 缺点:在文件修改期间硬盘会同时存在两份数据
# import os
# with open('e.txt',mode='rt',encoding='utf-8') as read_f,
# open('.e.txt.swap',mode='wt',encoding='utf-8') as write_f:
# for line in read_f:
# write_f.write(line.replace('dsb','alex'))
#
# os.remove('e.txt')
# os.rename('.e.txt.swap','e.txt')