从零学习python - 08文件操作与os模块

一 - 文件读 

# 文件操作
# open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)  打开文件并返回一个流。失败时引发OSError。
# file 是给出名称的文本文件(如果文件没有在同级目录就输入路径)或给定名字的字节字符串文件.
# mode 操作模式 默认是r表示读取 rt表示读取文本文件(t可省略) 纯文本文件使用:r(read) w(write) 二进制读写(多媒体读取)使用:rb(read binary) wb(write binary)
# buffering 是可选参数,用于设置缓冲策略。传递0来关闭缓冲(只允许在二进制模式下),1来选择行缓冲(仅在文本模式下可用),并以整数> 1表示固定大小的块缓冲区的大小。
# encoding 编码设置

 open()函数返回文件的stream流,可以通过stream流进行文件的读写操作

# 读取文件 container = stream.read()
stream = open(r'E:\a1\python_read_test.txt', encoding='utf-8')
container = stream.read()  # 读指定文件的内容
print(container)
print('------------------')
# stream流方法 readable()判断文件是否可读
result = stream.readable()  # 判断文件是否可读
print(result)  # True
print('------------------')
# readline() 如果文件流内容之前就被读取过,则返回空.因为前面用read()读取过了文件内容,所以这里是空
line = stream.readline()  # 一行一行读取文件内容
print(line)
print('------------------')
# 循环读取一行一行文件内容 如果文件流内容之前就被读取过,则返回空.因为前面用readline()读取了第一行,所以这次循环只会读取剩余内容
while True:
    line = stream.readline()
    print(line)
    if not line:
        break
print('------------------')
# readlines()会将文件内容每行内容以列表形式返回.如果文件流内容之前就被读取过,则返回空.前面被readline()读取完了,所以这里返回空
lines = stream.readlines()
print(lines)
print('------------------')
stream.close()  # 关闭

二- 文件写

# readlines()会将文件内容每行内容以列表形式返回.如果文件流内容之前就被读取过,则返回空.
lines = stream.readlines()
print(lines)
print('------------------')
stream.close()  # 关闭

# write(AnyStr)
stream.write('文件写入test001\n')
stream.write('文件写入test002\n')
stream.write('文件写入test003\n')

# 返回bool值判断是否可以写入
result = stream.writable()
print(result)

# 一行一行写入writelines(iterable[AnyStr])
stream.writelines('单行添加\n')
stream.writelines(['列表添加1', '列表添加2', '列表添加33'])

stream.close()

三- # with open() as 流名称: 会自动释放内存资源 自动执行close()方法

with open(r'E:\a1\copy1\xiaowang.jpg', 'rb') as stream:
    container = stream.read()
    # print(container)
    with open(r'E:\a1\copy2\xiawang.jpg', 'wb') as wStream:
        wStream.write(container)
    print('图片复制成功!')
# os模块:操作系统接口 (每个.py文件都是一个模块)
# __file__ 表示当前文件
path = os.path.dirname(__file__)
print(path)  # D:\python_Projects\file_try

with open(r'E:\a1\copy1\xiaowang.jpg', 'rb') as rStream:
    # 获取当前流地址 stream_path = E:\a1\copy1\xiaowang.jpg
    stream_path = rStream.name
    print(stream_path)
    # rfind返回查找到第一个元素的index 根据这个index进行字符串切割
    file_name = stream_path[stream_path.rfind('\\')+1:]
    # 获得流文件的原名称:xiaowang.jpg 如果复制文件要与原文件同名则可以使用file_name
    print(file_name)

    # 用流读取file文件使用容器container承接二进制字符串
    container = rStream.read()
    # path = D:\python_Projects\file_try
    path = os.path.dirname(__file__)
    # result = D:\python_Projects\file_try\xiaowang.jpg
    result = os.path.join(path, file_name)

    # 写文件 开始复制
    with open(result, 'wb') as wStream:
        wStream.write(container)

    print('文件复制完成!')

四 - os.path中常用函数

# 绝对路径: 完整路径
# 相对路径: 以当前文件位置为基准 找到需要查找的文件的路径  同级查找(xxx/文件名) 如果需要返回上一级(../xxx/文件名)
# os.path中常用函数
# 通过文件绝对路径路径得到该文件的目录地址
# os.path.dirname(path)

# os.path.isabs(s: str | bytes | PathLike[str] | PathLike[bytes]) 判断s是否为绝对路径 返回bool
# 方法运行结果: -> False
print(os.path.isabs('xiaowang.jpg'))

# os.path.abspath('xiaowang.jpg') 根据文件的相对路径路径得到该文件的绝对路径(如果要获取当前文件的绝对路径可以传入 __file__)
# 方法运行结果: -> D:\python_Projects\file_try\xiaowang.jpg
print(os.path.abspath('xiaowang.jpg'))

# os.getcwd() 获取当前文件所在文件夹的绝对路径
# 方法运行结果: -> D:\python_Projects\file_try 类似os.path.dirname(__file__)
print(os.getcwd())

# os.path.split(path) 传入路径,会对其进行切割,返回一个元组('文件所在目录路径', '文件名')
# 方法运行结果: -> ('D:\\python_Projects', 'file_try')
print(os.path.split(r'D:\python_Projects\file_try'))

# os.path.splitext(AnyStr) 传入路径,对进行切割,返回一个元组('文件所在路径', '文件扩展名')
# 方法运行结果: -> ('xiaowang', '.jpg')
print(os.path.splitext('xiaowang.jpg'))

# os.path.getsize(filename:StrOrBytesPath) 返回文件大小 以字节为单位
# 方法运行结果: -> 31796字节
print(os.path.getsize('xiaowang.jpg'))

# os.path.join(path, *paths) 会将*paths参数加到path路径后,可传多个
# 方法运行结果: -> D:\python_Projects\file_try\a\b\c
print(os.path.join(os.getcwd(), 'a', 'b', 'c'))

# os.path.isdir(s) 判断所传路径是否是文件夹 返回bool
os.path.isdir()

# os.path.isfile(path) 判断所传路径是否是文件 返回bool
os.path.isfile()

# os.path.exists(path) 判断path是否存在,返回bool
print(os.path.exists(r'E:\a1\copy1'))

 五 - os中常用函数

# os.getcwd() 获取当前文件所在文件夹的绝对路径
# 运行结果: -> D:\python_Projects\file_try
print(os.getcwd())

# os.listdir(r'E:\a1\copy1') 返回指定目录下所有文件夹与文件 以list[str]返回
# 运行结果: -> ['test1', 'test1.txt', 'xiaowang.jpg']
print(os.listdir(r'E:\a1\copy1'))

# os.mkdir(path) 创建文件夹 先用exists判断一下这个文件夹是否存在,如已经存在则会报错
if not os.path.exists(r'E:\a1\copy1\mkdir_test1'):
    os.mkdir(r'E:\a1\copy1\mkdir_test1')

# os.remove(path) Remove a file (same as unlink()). 删除文件 如果没有此文件则报错 删除前先判断一下
if os.path.exists(r'E:\a1\copy1\test1\remove1.txt'):
    os.remove(r'E:\a1\copy1\test1\remove1.txt')

# os.rmdir(path) Remove a directory. 删除文件夹 只能删除空文件夹
os.rmdir(r'E:\a1\copy1\mkdir_test1')

# 删除有内容的文件夹,可以通过listdir()得到文件夹中文件名列表,再遍历删除
path = r'E:\a1\copy1\rmdir1'
if os.path.exists(path):
    file_list = os.listdir(path)    # ['rmdir1test.txt', 'rmdir2test.txt', '新建 PPT 演示文稿.ppt']
    for file in file_list:
        rm_file = os.path.join(path, file)
        os.remove(rm_file)
    else:
        os.rmdir(path)

# os.chdir(path) 切换到指定目录下 (有点类似与cmd的cd命令)
print(os.getcwd())  # D:\python_Projects\file_try
os.chdir(r'E:\a1')
print(os.getcwd())  # E:\a1

六 - 实现文件夹复制

如果文件夹中没有别的文件夹的话可以使用下面的方法

def copy(src, target):
    if os.path.isdir(src) and os.path.isdir(target):
        file_list = os.listdir(src)

        for file in file_list:
            src_all_path = os.path.join(src, file)

            with open(src_all_path, 'rb') as rStream:
                container = rStream.read()
                target_all_path = os.path.join(target, file)

                with open(target_all_path, 'wb') as wStream:
                    wStream.write(container)
        else:
            print('复制完毕!')

如果文件夹下还有文件夹,那么就需要进行递归调用,再判断是否为文件夹后,创建文件夹即可

def copy_dir(src, target):
    # 判断传来的两个路径是否为文件夹
    if os.path.isdir(src) and os.path.isdir(target):
        file_list = os.listdir(src)

        # 遍历通过listdir()方法得到的文件夹内的文件名列表
        for file in file_list:
            # 将src路径后添加遍历的各个文件名称 组成完整的文件名 -> 'E:\xxx\xxx.txt'
            src_all_path = os.path.join(src, file)

            # 判断文件夹内是否还有文件夹 如果有的话进行递归方法调用
            if os.path.isdir(src_all_path):
                # 递归后的方法需要重新设定src路径 与target路径 手动拼接
                new_dir_path = os.path.join(target, file)
                # 判断新目标路径是否存在 同名文件夹中的文件夹
                if not os.path.exists(new_dir_path):
                    # 根据拼接的路径在target目录 创建文件夹内的文件夹
                    os.mkdir(new_dir_path)
                # 递归调用
                copy_dir(src_all_path, new_dir_path)

            else:
                # 读写文件内容
                with open(src_all_path, 'rb') as rStream:
                    container = rStream.read()
                    target_all_path = os.path.join(target, file)

                    with open(target_all_path, 'wb') as wStream:
                        wStream.write(container)

        print('文件夹内容复制完毕!')

你可能感兴趣的:(python学习,学习,python,pycharm,经验分享)