# python学习Tips:
# ///////////PY.08:文件操作//////////////////////////////////
# ====================================================
# 目录:
# 一、文件的定义和作用
# 二、文件的操作
# 1.打开文件
# 2.读文件
# 3.写文件
# 4.文件的追加
# 5.文件的读操作
# 三、读取大文件
# 四、二进制方式操作文件
# 五、文件的备份
# 六、对文件和目录的操作
# 1.文件重命名
# 2.删除文件
# 3.创建文件夹
# 4.获取当前目录
# 5.改变默认目录
# 6.获取目录列表
# 7.删除文件夹
# ====================================================
#
#//////////一、文件的定义和作用////////////////
# ===========1.文件===================
# 文件的作用:可以永久保存数据
# 文件在硬盘中储存的格式是二进制
# 文件的操作:使用代码而非鼠标点击来操作文件
#/////////二、文件的操作//////////////////
# -------------------------------------------
# 1.打开文件:将文件从硬盘中存到内存中
# open(file,mode='r', encoding=None)
# file:要操作的文件名,类型是str
# r(read)只读打开,w(write)只写打开, a(append)追加打开
# encoding 文件的编码格式,常见的编码格式有两种:gbk和utf_8
# 返回值,文件对象,后续所有的文件操作都需要通过这个文件对象进行
# 打开文件:
open()
# --------------------------------------------
# 2.读文件
# 读文件: 文件对象.read()
f = open('py07.py', 'r') # 打开文件
buf = f.read() # 读文件
print(buf)
f.close() # 关闭文件
# 以只读的方式打开当前目录中的该文件(文件不存在会报错)
# (只是举例,这里这个目录下没有这两个文件)
# 语法:
# 变量名 = open('文件名','打开模式')
# 疑问:当前目录是指?
# -------------------------------------------
# 3.写文件(/创建文件)
# ==========================================
# (1)打开文件
f = open('a.txt','w')
# 此处推荐改写成:f = open('a.txt','w', encoding='utf-8')
# w方式打开文件,若文件不存在,会创建文件
# 若文件存在,则会覆盖清空原文件
# (2)写入文件:文件对象.write(写入文件的内容)
f.write('hello world\n')
f.write('hello python\n')
f.write('你好世界\n') # 这行的结果会出现乱码
# 1.open函数打开文件,没有指定文件的编码,windows默认是gbk;
# 2.write函数将中文写入文件,要使用gbk编码写入
# 3.在pycharm中双击打开文件,默认使用的编码是utf-8
# 4.使用utf-8编码打开gbk编码的数据,会出现乱码
# 注:编码:可以通过编码这种东西将中文汉字转换为二进制,或者将二进制转换为汉字
# (实现互相转换)
# 输出乱码的解决方案:(将两种方式的编码统一即可)
# 方案一:open打开文件的时候,指定使用utf-8打开
# 方案二:pycharm中使用gbk方式
# (3)关闭文件
f.close()
# ==========================================
# 上述代码的改正:
f = open('b.txt','w', encoding='utf-8')
f.write('你好中国!')
f.close()
# ------------------------------------------------
# 4.追加文件('a'方式)
# a方式打开文件,追加内容,在文件的末尾写入内容
# 注意点:不管是用a方式打开文件还是用w方式打开,写内容都还是用write()函数
f = open('b.txt','a',encoding='utf-8') # 此处必须使用关键字传参
# 若文件不存在,会创建文件
f.write('111\n')
f.close()
# -------------------------------------------
# 5.文件的读操作(read)
##===(1)文件名.read(n)====
f = open('b.txt', 'r', encoding='utf-8') # 打开文件
buf = f.read()
print(buf)
# 读写文件:文件名.read(n) ;
# n:一次性读取n字节的内容,若不写,则读取全部内容
# 几个字节就是几个字符
f.close() # 关闭文件
# 再次尝试:
f = open('b.txt', 'r', encoding='utf-8') # 打开文件
buf = f.read(6)
print(buf)
f.close()
##===(2)f.readline()======
# 一次读取一行的内容,返回值是读取到的内容(str)
f = open('b.txt','r',encoding='utf-8')
buf = f.readline()
print(buf)
f.close()
##===(3)f.readlines()=====
# 按行读取,一次读取所有行,返回值是列表,
# 列表中的每一项(一行的内容)是一个字符串
# ////////////三、读取大文件////////////////////
# ///关于strip去空格///
# 注意:a = ' aaa '
# a.strip() # 去掉空格,输出'aaa'
# 即使是a = '\n aa \n'
# 前后的\n(换行)也可以去掉
# a.strip()输出是'aaa'
# 参考代码:(去掉文件中所有内容的空格操作)
f = open('b.txt', 'r', encoding='utf-8')
buf = f.readlines()
print(buf)
buf = [i.strip() for i in buf] # 利用遍历逐行去代码
print(buf)
f.close()
# read():一次读取全部的内容
# read()读到文件末尾会返回空
f = open('b.txt','r',encoding='utf-8')
while True:
buf = f.readline()
if buf: # 相当于if len(buf)>0 ;容器可以直接作为判断条件
#容器中有数据为True,没有数据为False
print(buf, end='')
else:
#文件读完了
break
f.close()
# ---------------------------------------------------
# Q1:对于一行写完的大文件怎么处理?(文件读取后发现通篇不换行)
f = open('b.txt','r', encoding='utf-8')
while True:
buf = f.read(5) # f.read(4096)
if buf:
print(buf, end='')
else:
break
f.close()
# --------------------------------------------------
# 补充:计算机中的大小
# 计算机只认识0和1(二进制)
# 十进制:0~9,逢10进1
# 十六进制:0~9,A B C D E F,逢16进1
# 计算机中最小的单位:bit(位),只有两个数据值0和1
# 字节:是计算机中的基本储存单位 (byte)
# 1byte = 8 bit
# 1kB = 1024 byte (2**10 = 1024)
# 1MB = 1024KB
# 1GB = 1024MB
# 1TB = 1024GB
# ……
# 100兆宽带,200兆宽带
# 100Mbits ,200Mbits (除以8得)
# 12.5mb/s ,25mb/s
# --------------------------------------------------
# ////////////////四、二进制方式操作文件////////////////
#
# 文本文件:能够用记事本打开的文件,有txt, .py, .md
# 二进制文件:具有特殊格式的文件,如mp3,mp4, rmvb, avi,png, jpg等
# 文本文件既可以使用文本方式,又可以使用二进制的方式打开文件;
# 二进制文件则只能使用二进制的方式打开文件(rb,wb,ab),注意:不能指定encoding参数
# 二进制打开方式如下:(读取和书写都需要二进制的方式,所以不需要转码)
f = open('c.txt', 'wb')
f.write('你好'.encode()) # encode():将str转换为二进制格式
f.close()
f1 = open('c.txt', 'rb')
buf = f1.read()
print(buf)
f1.close() # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'
# ///////////五、文件备份////////////////////////////
# 步骤:
# 1.用只读的方式打开文件
# 2.读取文件的内容
# 3,关闭文件
# 4.用只写的方式打开新文件
# 5.将第2步读取的内容写入新文件
# 6.关闭新文件
# 代码优化:
# 1.若文件较大,则循环读取文件
# 2.复制备份的文件可能是txt文件,也可能是二进制文件
# (所以最好使用二进制方式打开文件)
# 上述过程示例1:
# file_name = input('请输入要备份的文件名:')
#(下面的b.txt全用file_name替代)
f = open('b.txt','rb')
buf = f.read()
print(buf)
f.close()
f1 = open('d.txt','wb')
f1.write(buf)
f1.close()
# 示例2:
file_name = input('请输入要备份的文件名:')
f = open(file_name,'rb')
buf = f.read()
print(buf)
f.close()
index = file_name.rfind('.') # 找到文件名中.所在的下标位
new_file_name = file_name[:index]+'[备份]'+file_name[index:]
print(new_file_name)
f_w = open(new_file_name,'wb')
f_w.write(buf)
f_w.close() # 最终生成了'b[备份].txt'文件
# ///////////六、对文件和目录的操作/////////////////
# 对文件和目录的操作需要导入os模块
# 即:import os
#==========1.文件重命名==========
# os.rename('原文件路径名','新文件路径名')
import os
os.rename('a.txt','aa.txt')
#=========2.删除文件============
os.remove('aa.txt')
#=========3.创建目录============
# os.mkdir('目录路径名')
os.mkdir('test')
# os.mkdir('test/aa')
#========4.删除空目录=============
# os.rmdir(目录名)
# os.rmdir('test/aa')
#========5.获取当前所在的目录========
# 获取当前文件在哪个目录下面执行
# os.getcwd()
buf = os.getcwd()
print(buf)
# cwd: current working directory
#========6.修改当前的目录===========
os.chdir(r"C:\Users\LZYY\Desktop\学习\py学习")
buf = os.getcwd()
print(buf)
#========7.获取指定目录中的内容=========
# os.listdur(目录),默认不写参数,是获取当前目录中的内容
# 返回值是列表,列表中的每一项都是文件名
buf = os.listdir()
print(buf)
# 输出:
# ['desktop.ini', 'py01.py', 'py02.py', 'py03.py', 'py04.py', 'py05.py', 'py06.py', 'py07.py', 'py09.py']
# ///////////七、应用:批量修改文件名/////////////////
# ======1.批量创建文件名=============
def create_files():
for i in range(10): # 批量创建10个
file_name = 'test/file_' + str(i) + '.txt'
print(file_name)
# f = open('','w')
f = open(file_name, 'w')
f.close()
# =====2.批量修改文件名==============
import os
def modify_filename():
os.chdir('test')
buf_list = os.listdir()
print(buf_list)
for file in buf_list:
num = len('py43_')
new_file = file[num:] + file
os.rename(file, new_file)
os.chdir('../')