python中os文件 *** 作模块,案例解析

python中os文件 *** 作模块,案例解析,第1张

案例一:对指定路径下的文件按照时间排序,并对文件重名:         注意:

        1.获取文件时间的方法os模块下的 .getatime(‘文件路径’)得到一个时间值

        2.排序通过匿名函数,对时间进行排序

        3.重命名文件使用os模块下的 .rename('旧文件路径',‘新文件路径’),拆分文件路径然后再组装路径。源码如下:

import os
path='文件'
def get_time(path):
    return os.path.getatime(path)

# 遍历文件夹下的所有文件,然后调用上边的方法获取所有文件的修改时间
# for x in os.listdir(path):
#     print(path+'\'+x)
#改写为列表推导式
files=[path+'\'+x for x in os.listdir(path)]

# 排序按照关键字排序,对时间方法排序,调用时间方法,x指传入的文件路径
files.sort(key=lambda x:get_time(x))
# print(files)

# 计数器,文件前加序号
seq=1
for x in files:
    # print(x.split('.'))
    sp=x.split('.')
    # .join()传入两个参数,原路径,新路径
    os.rename(x,os.path.join(path , str(seq) +'-'+ sp[0].replace(path+'\','') + '.'  + sp[-1]))
    seq += 1
实现结果展示:

案例二:向 .txt 文本文档中读取、写入内容

        注意:写入txt的内容只能是字符串,或bytes类型,写入前注意转换。源码如下:

def is_prime(num):
    '''定义一个判断素数的方法,方便后续调用'''
    for i in range(2,int(num**0.5)+1):
        if num % i !=0 and num != 1:
            return num

def main1():
    '''读取文档中所有的素数'''
    with open('text1.txt','r',encoding='utf-8') as fp:
        for x in fp.readlines():
            if is_prime(int(x)):
                print(x)

def main2():
    '''读取文档中每一行的内容,内容有非整数,找出所有的素数'''
    with open('text2.txt','r',encoding='utf-8') as fp:
        for x in fp.readlines():
            # 异常调试
            try:
                if is_prime(int(x)):
                    print(x,end=' ')
            except ValueError:
                pass

def main3():
    '''向文件中写入指定范围素数'''
    with open('text3.txt', 'w+', encoding='utf-8') as fp:
        for x in range(1,10000):
            if is_prime(int(x)):
                fp.write(f'{x}\n')    # txt只能写入字符串str 和二进制字符串bytes

if __name__ == '__main__':
    main1()
    main2()
    main3()
案例三:以json的格式将数据写入文本文档

        注意:从python中写入到文本文档中,用 json.dumps() 序列化;

                   从文本中读取数据,json.loads() 反序列化。源码如下:

import json
### 将1-9999之间的素数写入到一个文本文件中,每行一个数字。
def is_sushu(num):
    for i in range(2,int((num)**0.5)+1):
        if num % i == 0:
            return False
    return True

def writefile():
    with open('tes.txt','w+',encoding='utf-8') as fp:
        for x in range(1,10000):
            if is_sushu(x):
                fp.write(str(x)+'\n')

### 将1-9999之间的素数放到一个列表中,将列表写入文件。
list1=[num1 for num1 in range(1,10000) if is_sushu(num1)]
with open('tes1.txt','w',encoding='utf-8') as fp:
    # 从python中写入文本,用json序列化
    fp.write(json.dumps(list1))

### 读取练习3或练习4中生成的文件获得素数的列表,将列表变成一个字典,字典中的键是列表中的元素,值是该元素的平方。
with open('tes1.txt','r',encoding='utf-8') as fp:
    # 从文本中读取数据,json反序列化
    data=json.loads(fp.read())
    dict1={i:i**2 for i in data}
    print(dict1)
案例四:递归删除文件夹(可能包含子文件或子文件夹)

        需求:要先将文件夹中的所有子文件删除再删除本文件夹【温馨提示:创建一个文件夹,不要直接 *** 作已有的文件夹】

        注意:remove( ): 删除文件;rmdir( ): 删除空目录(空文件夹)。源码如下:

import os
def remove_dir(path):
    try:
        # 遍历路径
        for x in os.listdir(path):
            #拼接文件的路径
            path1 = os.path.join(path, x)
            if os.path.isdir(path1):
                #递归调用原函数
                remove_dir(path1)
            elif os.path.isfile(path1):
                # 删除指定路径的文件
                os.remove(path1)
        else:
            # 当文件中没有任何文件时执行这一步,删除空文件夹
            os.rmdir(path)
    # 对异常进行处理
    except FileNotFoundError:
        print('系统找不到指定的路径!!')

if __name__ == '__main__':
    remove_dir('newdir/dir1')
案例五:复制目录,考虑拷贝所有子文件,完全复制一个文件到指定文件路径下

        提示:遍历sourcePath下的所有子目录和子文件

                1,如果是子文件,则复制文件

                2,如果是子目录,在目标目录创建相同的目录名称,递归调用 

        注意:子文件或子目录的绝对路径。源码如下:

import os
def copyPath(sourcePath, targetPath):
    # 判断原目录是否存在
    if not os.path.exists(sourcePath):
        return "目录不存在"
    try:
        # 判断目标目录是否存在,如果不存在则创建
        if not os.path.exists(targetPath):
            os.mkdir(targetPath)

        for x in os.listdir(sourcePath):
            path1=os.path.join(sourcePath,x)
            if os.path.isdir(path1):
                # 如果是文件夹则在新文件夹中创建一个同名的文件夹,实现完全复制一个一模一样文件的功能
                os.mkdir(targetPath+'\'+x)
                # 调用原函数,传入路径进行自动更新
                copyPath(path1,targetPath+'\'+x)
            else:
                file = open(path1, 'r', encoding='utf-8')
                new_path=targetPath+'\'+x
                fp = open(new_path, 'w', encoding='utf-8')
                # 写入文件,以指定大小1024字节读取、写入
                while True:
                    data=file.read(1024)
                    fp.write(data)
                    if data:
                        break
                file.close()
                fp.close()
    # 异常处理
    except FileExistsError:
        print('当文件已存在时,无法创建该文件')

if __name__ == "__main__":
    # 将sourcePath目录的所有内容拷贝到targetPath目录下
    sourcePath = r"XXXXXXXXXX\homework\newdir"
    targetPath = r"XXXXXXXXXXX\homework\dir4"
    copyPath(sourcePath, targetPath)
案例六:统计当前目录下的文件数量和文件夹数量;使用函数递归,分别统计文件夹中文件和文件夹的个数。

   提示:1.如果碰到文件,则文件数量+1;

             2.如果是文件夹,则文件夹数量+1,递归调用fn()传入当前子文件夹路径,访问内部的文件

   注意:此处容易踩坑,在函数外部定义一个计数器,在函数内部进行修改时,声明全局变量

             源码如下:

import os
dir_count=0
file_count=0
def fn(dirPath):
    # 在外部定义一个计数器,在函数内部进行修改,设置为全局变量
    # 如果在函数内部定义计数器,只会返回循环体最后一次出现的值
    global dir_count,file_count

    for x in os.listdir(dirPath):
        path1=os.path.join(dirPath,x)
        if os.path.isdir(path1):
            dir_count+=1
            fn(path1)
        else:
            file_count+=1
    return dir_count,file_count

if __name__ == '__main__':
    path=r'XXXXXXXXX\newdir\dir3'
    print(fn(path))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/943140.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存