# 文件操作

# 一、读取

'''
文件操作:
    概述:
        文件操作指的是根据路径获取其对应的文件对象, 然后进行读, 写, 追加等操作.
    格式:
        文件对象名 = 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

# 二、写入

'''
文件操作之写:
    概述:
        所谓的写的意思是把数据写入到文件中.
    格式:
        文件对象名 = 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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 三、拷贝

'''
文件操作之拷贝:
    概述:
        所谓的拷贝指的就是备份文件, 获取拷贝文件.
    思路:
        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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# # 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 四、os模块常用函数解释

'''
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')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
更新时间: 2/4/2024, 10:22:42 PM