目录
一、文件打开关闭
(1)打开文件
(2)关闭文件
(1)写文件
二、文件读写
(2)读文件
(3)with
# 文件的操作
# 打开文件 open
# 默认的编码是gbk 这个是中文编码,最好的习惯呢就是我们再打开一个文件的时候
# 给它指定一个编码类型
# fobj=open('./Test.txt','w',encoding='utf-8')
# # 开始操作 读/写操作
# fobj.write('在苍茫的大海上')
# fobj.write('狂风卷积着乌云')
# fobj.write('在乌云和大海之间\r\n')
# fobj.write('海燕像黑色的闪电\r\n')
# fobj.close()
# 以二进制的形式去写数据
# fobj=open('Test_1.txt','wb') #str-->bytes
# fobj.write('在乌云和大海之间'.encode('utf-8'))
# fobj.close()
# fobj=open('Test.txt','a') #用于追加数据,不需要.encode('utf-8'),ab要编码
# fobj.write('在乌云和大海之间\r\n')
# fobj.write('海燕像黑色的闪电\r\n')
# fobj.close()
fobj=open('Test.txt','a') # a 用于追加数据
fobj.write('在苍茫的大海上')
fobj.write('狂风卷积着乌云')
fobj.write('在乌云和大海之间\n')
fobj.write('海燕像黑色的闪电\n')
fobj.write('今天我诗兴大发\n')
fobj.write('发感觉咋样呢\n')
fobj.close()
# 读数据操作
f=open('Test.txt','rb')
data=f.read() #读取所有的数据
print(data)
print(data.decode('gbk'))
# print(f.read(12))
# # print(f.read())
# print(f.readline()) #读一行数据
# print(f.readlines(1))
# f.close() #文件对象关闭掉
# with上下文管理对象
# 优点 自动释放打开关联的对象
with open('Test.txt','a') as f:
# print(f.read())
f.write('我觉得python非常的好学\n')
# 小结
# 文件读写的几种操作方式
# read r r+ rb rb+
# r r+ 只读 使用普通读取场景
# rb rb+ 适用于 文件 图片 视频 音频 这样文件读取
# write w w+ wb+ wb a ab
# w wb+ w+ 每次都会去创建文件
# 二进制读写的时候 要注意编码问题 默认情况下 我们写入文件的编码是gbk
# a ab a+ 在原有的文件的基础之后去【文件指针的末尾】去追加,
# 并不会每次的都去创建一个新的文件
def ctime(sec):
pass
三、应用:文件备份脚本
# import fileOpt
# 文件的备份
# def copyFile():
# # 接收用户输入的文件名
# old_file=input('请输入要备份的文件名:')
# file_list=old_file.split('.')
# # 构造新的文件名.加上备份的后缀
# new_file=file_list[0]+'_备份.'+file_list[1]
# old_f=open(old_file,'r') #打开需要备份的文件
# new_f=open(new_file,'w') #以写的模式去打开新文件,不存在则创建
# content=old_f.read() #将文件内容读取出来
# new_f.write(content) #将读取的内容写入到备份文件
# old_f.close()
# new_f.close()
# pass
#
# copyFile()
def copyBigFile():
# 接收用户输入的文件名
old_file=input('请输入要备份的文件名:')
file_list=old_file.split('.')
# 构造新的文件名.加上备份的后缀
new_file=file_list[0]+'_备份.'+file_list[1]
try:
#监视啊哟处理的逻辑
with open(old_file,'r') as old_f,open(new_file,'w')as new_f:
while True:
content=old_f.read(1024) #一次读取1024字符
new_f.write(content)
if len(content)<1024:
break
except Exception as msg:
print(msg)
pass
copyBigFile()
四、文件定位
utf-8:默认一个汉字占3个字节
gbk:一个汉字2个字节
# tell 返回指针当前所在的位置
# 对于中文讲 每次读取到的一个汉字 实际上占用了 2个字符
# with open('Test.txt','r+') as f:
# print(f.read(3))
# print(f.tell())
# print(f.read(2))
# print(f.tell())
# pass
# truncate 可以对源文件进行截取操作
# fobjB=open('Test.txt','r')
# print(fobjB.read())
# fobjB.close()
# print('截取之后的数据........')
#
# fobjA=open('Test.txt','r+')
# fobjA.truncate(15) #保留前15个字符
# print(fobjA.read())
# fobjA.close()
# seek 可以控制光标所在位置
with open('Test_备份.txt','rb') as f:
f.seek(4,0) #光标是从0的位置开始 像前【右】移动 4个字符
data=f.read(2)
print(data.decode('gbk'))
f.seek(-2,1) #相当于光标有设置到了0的位置
print(f.read(4).decode('gbk'))
f.seek(-6,2) #2 表示光标在末尾处 往回移动了6个字符
print(f.read(4).decode('gbk'))
pass
# 对于这种情况 用'r'这种模式打开文件,在文本文件中,没有使用二进制的选项打开文件,
# 只允许从文件的开头计算相对位置,从文件尾部计算或者当前计算的话 就会引发异常
turncate:裁剪文件,源文件也被裁剪
五、import导入模块
六、os模块操作文件
import os
import shutil
# os.rename('Test.txt','Test_重命名.txt')
# os.remove('File_del.py') #删除文件 前提是文件必须存在
# os.mkdir('TestCJ') 创建文件夹
# os.rmdir('TestCJ') #删除文件夹 文件必须存在
# mkdir 创建一级目录
# os.mkdir('d:/Python编程/sub核心') #不允许创建多级
# 创建多级目录
# os.makedirs('d:/Python编程/sub核心/三级sub') #允许
# os.rmdir('d:/Python编程') #只能删除空目录
# 如果要删除非空目录的话 就需要调用shutil模块
# shutil.rmtree('d:/Python编程') #非空删除
# 获取当前的目录
# print(os.getcwd())
# 路径的拼接
# print(os.path)
# print(os.path.join(os.getcwd(),'venv'))
# 获取python中的目录列表
# listRs=os.listdir('d:/') 老版本的用法
# for dirname in listRs:
# print(dirname)
# 使用现代版的写法
# scandir 和 with一起来使用 这样的话 上下文管理器会在迭代器遍历完成后自动
# 去释放资源
# with os.scandir('d:/') as entries:
# for entry in entries:
# print(entry.name)
basePath='d:/'
for entry in os.listdir(basePath):
# if os.path.isfile(os.path.join(basePath,entry)):
# print(entry)
if os.path.isdir(os.path.join(basePath,entry)):
print(entry)
pass
七、模块的制作、发布、安装
7.1 模块的制作
moudel:
# 模块的制作说明
# __all__魔术变量的作用是 如果在一个文件中存在 __all__变量,那么也就意味着这个变量中的元素
# 会被from XXX import *时会被导入,对于import 方式来讲 无所谓 有没有 都可以全部的引用
__all__=['add','diff']
def add(x,y):
'''
普通的函数
:param x:
:param y:
:return:
'''
return x+y
def diff(x,y):
return x-y
def printInfo():
return '这是我自定义模块里面的方法'
# 测试
if __name__=='__main__':
res=add(2,5)
print('测试模块, %s'%res)
print('模块__name__变量=%s'%__name__)
pass
调用:
from moudelTest.moudelTest import moudelTest
# from moudelTest import add #第二种导入方式
# res=moudelTest.add(1,3)
# print(moudelTest.diff(7,4))
print(moudelTest.printInfo()) #尽管不在 __all__ 中 也可以调用
# print(res)
# print(add(67,3))
# print(diff(34,3))
# print(printInfo()) #对于这种情况 就不能使用了 因为没有在__all__中