'''
文件操作:
概述:
文件操作指的是根据路径获取其对应的文件对象, 然后进行读, 写, 追加等操作.
格式:
文件对象名 = open('文件路径', '模式')
模式解释:
r: read, 只读
rb: read byte, 以字节的形式只读
w: write, 只写
wb: write byte, 以字节的形式写入
a: append, 追加
ab: append byte, 以字节的方式追加.
关于读的函数解释:
read(长度) 如果写长度了, 表示一次读取多少, 如果不写, 表示一次读完, 并返回读取到的内容.
readline() 一次读取一行, 采用 \n作为结束符.
readlines() 读取所有的行, 行之间是用\n隔开的.
close() 关闭文件对象, 相当于把文件关了, 用于: 释放资源.
相关的几个单词:
file(文件), read(读), write(写), close(关闭), byte(字节), line(行), src(数据源), dest(目的地), append(追加)
关于路径解释:
1. 所谓的路径指的就是 文件的路径, 又分为: 绝对路径 和 相对路径.
2. 绝对路径指的是 固定的, 写死的路径, 都是以 盘符开头的, 例如: d:/1.txt
3. 相对路径指的是 相对于某个路径来讲的, 一般默认是 当前模块的路径.
例如: 你写了1.txt, 则它对应的绝对路径默认是 当前项目路径/1.txt, 具体如下:
D:\workspace\bigdata71_bj\pythonBasic\day07\1.txt
4. 一些细节, 具体如下:
./ 表示当前路径, 还可以省略不写, 建议写上.
../ 表示上一级
如果你写绝对路径, 用到文件分隔符了, 如果是左斜线/, 直接写即可, 如果是右斜线, 要写成\\
因为\在Python中表示转义符, \\才表示一个\
'''
# 1. 创建文件对象.
# 参数1: 数据源文件路径, 参数2: 模式, r(只读), 参数3: 采用什么码表
# 相对路径
# f = open('1.txt', 'r', encoding='utf-8')
# 绝对路径
# f = open('D:\\workspace\\bigdata71_bj\\pythonBasic\\day07\\1.txt', 'r', encoding='utf-8')
# f = open('D:/workspace/bigdata71_bj/pythonBasic/day07/1.txt', 'r', encoding='utf-8')
# ../表示上一级
f = open('../../1.txt', 'r', encoding='utf-8')
# 2. 具体的操作(读或者是写, 这里先演示 读)
# 方式1: read()方式读取
# data = f.read() # 不过不写长度, 默认读取所有.
# data = f.read(3) # 默认读取3个字符
# 方式2: 一次读取一行.
# data1 = f.readline()
# data2 = f.readline()
# print(data1, end='')
# print(data2, end='')
# 方式3: 一次读取所有行, 然后遍历.
lines = f.readlines()
# print(lines)
# 3. 打印读取到的内容.
# lines是所有的行, 我们遍历它
for line in lines:
print(line, end='')
# 4. 释放资源(关闭文件对象)
f.close()
'''
文件操作之写:
概述:
所谓的写的意思是把数据写入到文件中.
格式:
文件对象名 = open('文件路径', '模式')
关于写的函数解释:
write(数据) 把数据写到目的地文件中.
close() 释放资源
细节:
1. 如果目的地文件不存在, 会自动帮我们创建.
2. 前提是该文件的父目录必须存在.
3. 例如: 目的地文件的路径是: d:/abc/1.txt, 则1.txt可以不用存在, 但是 d:/abc必须存在.
'''
# 1. 获取文件对象.
# 相对路径.
# f = open('./2.txt', 'w', encoding='utf-8') # w表示写入, 默认是: 覆盖
f = open('./2.txt', 'a', encoding='utf-8') # a表示写入, 即: 追加写入
# 绝对路径.
# f = open('D:/workspace/bigdata71_bj/pythonBasic/day07/2.txt', 'w', encoding='utf-8')
# 因为父目录不存在, 所以会报错
# f = open('D:/workspace/bigdata71_bj/pythonBasic/day08/2.txt', 'w', encoding='utf-8')
# 2. 往文件中写数据.
# write()函数解释: 把数据写到文件中, 并返回写入的具体的 数据长度.
len = f.write('Hello World!\n你好, 世界, 我来了!123ABCsdf!@#!@\n')
# 3. 打印结果.
print(len)
# 4. 释放资源.
f.close()
'''
文件操作之拷贝:
概述:
所谓的拷贝指的就是备份文件, 获取拷贝文件.
思路:
1. 获取文件对象, 关联: 数据源文件.
2. 获取文件对象, 关联: 目的地文件.
3. 具体的复制内容的过程.
4. 释放资源.
'''
# 首先先解决 备份文件名的问题, 例如: 数据源文件叫1.txt, 则备份文件名叫 1[备份].txt
# 1. 定义变量, 记录: 数据源文件名.
# src_name = '斗罗大陆.唐三.png'
# # 2. 从上述的文件名中获取 最后一个.的位置.
# index = src_name.rfind('.')
# # print(index)
# # 3. 拼接新的文件(目的地文件)名.
# dest_name = src_name[:index] + '[备份]' + src_name[index:]
# print(dest_name)
# 如下是具体的拷贝文件的动作.
# 1. 获取文件对象, 关联: 数据源文件.
# 1.1 提示用户录入数据源文件名, 并接收.
src_name = input('请录入您要备份的文件名: ')
# 1.2 根据用户录入的文件, 获取其对应的文件对象.
src_f = open(src_name, 'rb', encoding='utf-8')
# 2. 获取文件对象, 关联: 目的地文件.
# 2.1 根据数据源数据获取其对应的 目的地文件名.
index = src_name.rfind('.')
dest_name = src_name[:index] + '[备份]' + src_name[index:]
# 2.2 根据上述的目的地文件路径, 获取其对应的 文件对象.
dest_f = open(dest_name, 'wb', encoding='utf-8')
# 3. 具体的复制内容的过程.
# 方式1: 一次读取所有, 然后全部写入.
# data = src_f.read() # 不写长度, 则一次读完, 并返回读取到的数据.
# dest_f.write(data)
# 方式2: 读取所有行, 然后写入所有行.
# lines = src_f.readlines()
# dest_f.writelines(lines)
# 方式3: 一次读取一定的长度, 然后写入.
# 因为上述的方式都是一次性读取所有数据, 如果文件内容多大, 一次读取所有数据容易造成宕机的风险.
while True: # 采用死循环读取
# 一次读取1024个字符
data = src_f.read(1024)
# 如果data的长度等于0, 说明读完了.
if len(data) == 0:
break # 结束循环.
# 走到这里, 说明读取到数据了, 我们就写入目的地即可.
dest_f.write(data)
# 4. 释放资源.
src_f.close()
dest_f.close()
# # 1. 获取文件对象, 关联 数据源文件.
# src_name = input('请录入您要拷贝的数据源文件的路径:') # 123.txt
# src_f = open(src_name, 'rb') # 以二进制的方式读取, 任何文件的底层都是二进制形式.
#
# # 2. 获取文件对象, 关联 目的地文件.
# # 2.1 根据数据源文件, 获取目的地文件名.
# index = src_name.rfind('.')
# dest_name = src_name[:index] + '[夯哥出品]' + src_name[index:]
# # 2.2 根据上述的文件名, 获取其对应的 文件对象形式.
# dest_f = open(dest_name, 'wb') # 以二进制方式写入.
#
# # 3. 采用死循环的方式拷贝, 只要没有拷贝完, 就一直循环.
# while True:
# # 4. 采用一次读取指定长度的方式, 从数据源文件中获取数据.
# data = src_f.read(1024)
# # 5. 判断只要读取到的数据长度为0, 就说明读完了, 循环结束.
# if len(data) == 0:
# break
# # 6. 走到这里, 说明读取到数据了, 就写入到目的地文件中.
# dest_f.write(data)
#
# # 7. 释放资源.
# src_f.close()
# dest_f.close()
# 上述代码的优化版, 考虑到: 文件名不合法的问题.
# 1. 获取文件对象, 关联 数据源文件.
src_name = input('请录入您要拷贝的数据源文件的路径:') # 123.txt
index = src_name.rfind('.') # .txt -> 0, abc -> -1
if index <= 0:
print('录入的文件名不合法')
else:
src_f = open(src_name, 'rb') # 以二进制的方式读取, 任何文件的底层都是二进制形式.
# 2. 获取文件对象, 关联 目的地文件.
# 2.1 根据数据源文件, 获取目的地文件名.
# 走这里, 说明文件路径合法.
dest_name = src_name[:index] + '[夯哥出品]' + src_name[index:]
# 2.2 根据上述的文件名, 获取其对应的 文件对象形式.
dest_f = open(dest_name, 'wb') # 以二进制方式写入.
# 3. 采用死循环的方式拷贝, 只要没有拷贝完, 就一直循环.
while True:
# 4. 采用一次读取指定长度的方式, 从数据源文件中获取数据.
data = src_f.read(1024)
# 5. 判断只要读取到的数据长度为0, 就说明读完了, 循环结束.
if len(data) == 0:
break
# 6. 走到这里, 说明读取到数据了, 就写入到目的地文件中.
dest_f.write(data)
# 7. 释放资源.
src_f.close()
dest_f.close()
'''
OS模块解释:
概述:
OS全称指的是OperatingSystem(操作系统), 即: 用来管理所有的文件, 文件夹, 路径等信息的.
使用步骤:
1. 先导入.
import os
2. 然后就可以使用os模块的函数了.
格式: os.函数名(实参)
常用函数:
getcwd() 获取默认路径, 默认是当前项目(工程)的路径
chdir() 改变默认路径
listdir() 查看当前路径下所有的文件(夹)
mkdir() 创建文件夹
renames() 修改名字
rmdir() 删除
'''
# 1. 导入os模块
import os
# 2. 获取当前的默认路径
print(os.getcwd())
# 3. 修改默认路径
# os.chdir('d:/abc')
# 4. 获取当前路径下所有的文件(夹)
print(os.listdir())
# 5. 创建文件夹
# os.mkdir('abc')
# 6. 修改文件(夹)名字
# os.renames('abc', 'xyz')
# 7. 删除文件(夹)
# os.rmdir('xyz')