IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 文件与文件夹操作 -> 正文阅读

[Python知识库]Python 文件与文件夹操作

os模块

  • chdir(path) 把path设为当前工作目录
  • curdir 返回当前文件夹
  • environ 包含系统环境变量和值的字典
  • extsep 当前操作系统所使用的文件扩展名分隔符
  • get_exec_path() 返回可执行文件的搜索路径
  • getcwd() 返回当前工作目录
  • listdir(path) 返回path目录下的文件和目录列表
  • remove(path) 删除指定的文件,要求用户拥有删除文件的权限,并且文件没有只读或其他特殊属性
  • rename(src, dst) 重命名文件或目录,可以实现文件的移动,若目标文件已存在则抛出异常,不能跨越磁盘或分区
  • replace(old, new) 重命名文件或目录,若目标文件已存在则直接覆盖,不能跨越磁盘或分区
  • scandir(path=‘.’) 返回包含指定文件夹中所有DirEntry对象的迭代对象,遍历文件夹时比listdir()更加高效
  • sep 当前操作系统所使用的路径分隔符
  • startfile(filepath [, operation]) 使用关联的应用程序打开指定文件或启动指定应用程序
  • system() 启动外部程序
>>> import os
>>> import os.path
>>> os.rename('C:\\dfg.txt',
'D:\\test2.txt') #rename()可以实现文件的改名和移动
>>> [fname for fname in os.listdir('.')if fname.endswith(('.pyc','.py','.pyw'))] #结果略
>>> os.getcwd() #返回当前工作目录'C:\\Python35'
>>> os.mkdir(os.getcwd()+'\\temp') #创建目录
>>> os.makedirs(os.getcwd()+'\\temp', exist_ok=True) 
#可以递归创建
>>> os.chdir(os.getcwd()+'\\temp') #改变当前工作目录
>>> os.getcwd()
'C:\\Python35\\temp'
>>> os.mkdir(os.getcwd()+'\\test')
>>> os.listdir('.')
['test']
>>> os.rmdir('test') #删除目录
>>> os.listdir('.')
[]
>>> os.environ.get('path') #获取系统变量path的值
>>> import time
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.stat('yilaizhuru2.py').st_ctime))#查看文件创建时间
'2016-10-18 15:58:57'
>>> os.startfile('notepad.exe') #启动记事本程序

os.path模块

  • abspath(path) 返回给定路径的绝对路径
  • basename(path) 返回指定路径的最后一个组成部分
  • commonpath(paths) 返回给定的多个路径的最长公共路径
  • commonprefix(paths) 返回给定的多个路径的最长公共前缀
  • dirname§ 返回给定路径的文件夹部分
  • exists(path) 判断文件是否存在
  • getatime(filename) 返回文件的最后访问时间
  • getctime(filename) 返回文件的创建时间
  • getmtime(filename) 返回文件的最后修改时间
  • getsize(filename) 返回文件的大小
  • isabs(path) 判断path是否为绝对路径
  • isdir(path) 判断path是否为文件夹
  • isfile(path) 判断path是否为文件
  • *join(path, paths) 连接两个或多个path
  • realpath(path) 返回给定路径的绝对路径
  • relpath(path) 返回给定路径的相对路径,不能跨越磁盘驱动器或分区
  • samefile(f1, f2) 测试f1和f2这两个路径是否引用的同一个文件
  • split(path) 以路径中的最后一个斜线为分隔符把路径分隔成两部分,以元组形式返回
  • splitext(path) 从路径中分隔文件的扩展名
  • splitdrive(path) 从路径中分隔驱动器的名称
>>> path=
'D:\\mypython_exp\\new_test.txt'
>>> os.path.dirname(path) #返回路径的文件夹名'D:\\mypython_exp'
>>> os.path.basename(path) #返回路径的最后一个组成部分'new_test.txt'
>>> os.path.split(path) #切分文件路径和文件名('D:\\mypython_exp','new_test.txt')
>>> os.path.split('') #切分结果为空字符串
('','')
>>> os.path.split('C:\\windows') #以最后一个斜线为分隔符
('C:\\','windows')
>>> os.path.split('C:\\windows\\')
('C:\\windows','')
>>> os.path.splitdrive(path) #切分驱动器符号
('D:','\\mypython_exp\\new_test.txt')
>>> os.path.splitext(path) #切分文件扩展名
('D:\\mypython_exp\\new_test',='.txt')

使用递归法遍历指定目录下所有子目录和文件。

from os import listdir
from os.path import join, isfile, isdir
def listDirDepthFirst(directory):
'''深度优先遍历文件夹'''
#遍历文件夹,如果是文件就直接输出
#如果是文件夹,就输出显示,然后递归遍历该文件夹
for subPath in listdir(directory):
    path = join(directory, subPath)
    if isfile(path):
        print(path)
    elif isdir(path):
        print(path)
        listDirDepthFirst(path)

shutil模块

  • copy(src, dst) 复制文件,新文件具有同样的文件属性,如果目标文件已存在则抛出异常
  • copy2(src, dst) 复制文件,新文件具有原文件完全一样的属性,包括创建时间、修改时间和最后访问时间等等,如果目标文件已存在则抛出异常
  • copyfile(src, dst) 复制文件,不复制文件属性,如果目标文件已存在则直接覆盖
  • copyfileobj(fsrc, fdst) 在两个文件对象之间复制数据,例如
    copyfileobj(open('123.txt'),open('456.txt','a'))
    
  • copymode(src, dst) 把src的模式位(mode bit)复制到dst上,之后二者具有相同的模式
  • copystat(src, dst) 把src的模式位、访问时间等所有状态都复制到dst上
  • copytree(src, dst) 递归复制文件夹
  • disk_usage(path) 查看磁盘使用情况
  • move(src, dst) 移动文件或递归移动文件夹,也可以给文件和文件夹重命名
  • rmtree(path) 递归删除文件夹
  • make_archive(base_name,format, root_dir=None,base_dir=None) 创建tar或zip格式的压缩文件
  • unpack_archive(filename,extract_dir=None,format=None) 解压缩压缩文件

使用例

如何使用标准库shutil的copyfile()方法复制文件

>>> import shutil #导入shutil模块
>>> shutil.copyfile('C:\\dir.txt','C:\\dir1.txt') #复制文件

将C:\Python35\Dlls文件夹以及该文件夹中所有文件压缩至D:\a.zip文件:将C:\Python35\Dlls文件夹以及该文件夹中所有文件压缩至D:\a.zip文件:

>>> shutil.make_archive('D:\\a','zip','C:\\Python35',
'Dlls')
'D:\\a.zip'

将刚压缩得到的文件D:\a.zip解压缩至D:\a_unpack文件夹:

>>> shutil.unpack_archive('D:\\a.zip','D:\\a_unpack')

下面的代码使用shutil模块的方法删除刚刚解压缩得到的文件夹

>>> shutil.rmtree('D:\\a_unpack')

码使用shutil的copytree()函数递归复制文件夹,并忽略扩展名为pyc的文件和以“新”字开头的文件和子文件夹:

>>> from shutil import copytree, ignore_patterns
>>> copytree('C:\\python35\\test','D:\\des_test'ignore=ignore_patterns('*.pyc','新*'))

实践

把指定文件夹中的所有文件名批量随机化,保持文件类型不变。

from string import ascii_letters
from os import listdir, rename
from os.path import splitext, join
from random import choice, randint
def randomFilename(directory):
for fn in listdir(directory):
    #切分,得到文件名和扩展名
    name, ext = splitext(fn)
    n = randint(5, 20)
    #生成随机字符串作为新文件名
    newName = ''.join((choice(ascii_letters) for i in range(n)))
    #修改文件名
    rename(join(directory, fn), join(directory, newName+ext))
randomFilename('C:\\test')

编写程序,统计指定文件夹大小以及文件和子文件夹数量。

import os
totalSize = 0
fileNum = 0
dirNum = 0
def visitDir(path):
global totalSize
    global fileNum
    global dirNum
    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        if os.path.isfile(sub_path):
            fileNum = fileNum+1 #统计文件数量
            totalSize = totalSize+os.path.getsize(sub_path) #统计文件总大小
        elif os.path.isdir(sub_path):
            dirNum = dirNum+1 #统计文件夹数量
visitDir(sub_path) #递归遍历子文件夹

def main(path):
    if not os.path.isdir(path):
        print('Error:"', path,'" is not a directory or does notexist.')
        return
    visitDir(path)
def sizeConvert(size): #单位换算
    K, M, G = 1024, 1024**2, 1024**3
    if size >= G:
        return str(size/G)+'G Bytes'
    elif size >= M:
        return str(size/M)+'M Bytes'
    elif size >= K:
        return str(size/K)+'K Bytes'
    else:
        return str(size)+'Bytes'

def output(path):
    print('The total size of '+path+' is:'+sizeConvert(totalSize)+'('+str(totalSize)+' Bytes)')
    print('The total number of files in '+path+' is:',fileNum)
    print('The total number of directories in '+path+' is:',dirNum)
if __name__=='__main__':
    path = 'C:\\text_dir'
    main(path)
    output(path)

编写程序,递归删除指定文件夹中指定类型的文件和大小为0的文件。

from os.path import isdir, join, splitext
from os import remove, listdir, chmod, stat
filetypes = ('.tmp', '.log', '.obj', '.txt') #指定要删除的文件类型
def delCertainFiles(directory):
    if not isdir(directory):
        return
    for filename in listdir(directory):
        temp = join(directory, filename)
        if isdir(temp):
            delCertainFiles(temp) #递归调用
        elif splitext(temp)[1] in filetypes or stat(temp).st_size==0:
            chmod(temp, 0o777) #修改文件属性,获取删除权限
            remove(temp) #删除文件
            print(temp, ' deleted....')
delCertainFiles(r'C:\test')
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:52:00  更:2022-05-10 11:52:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:09:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码