zoukankan      html  css  js  c++  java
  • Python IO编程-组织文件

    对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文件是这样的

    Python的 os 模块封装了操作系统的目录和文件操作,要注意这些函数有的在 os 模块中,有的在 os.path 模块中。

    、 shutil 模块

      复制、移动、改名、和删除文件

       

    1.1复制文件和文件夹

       shutil.copy(source,destination) 将路径 source 处的文件复制到路径 destination 处的文件夹

    >>>import shutil,os
    >>>os.chdir('C:\')
    >>>shutil.copy('C:\spam.txt','C:\delicious')
    'C:\delicious\spam.txt'  #返回的是被复制文件的新路径
    >>>shutil.copy('eggs.txt','C:\delicious\eggs2.txt')    #假如提供了文件名,会作为新复制的文件名
    'C:\delicious\eggs2.txt'
    

       shutil.copytree(source,destination) 复制整个文件夹,将路径 source 处的文件夹,包括他的所有文件和子文件夹

    1.2文件和文件夹的移动与改名

       shutil.move(source,destination)   

    >>>import shutil 
    >>>shutil.move('C:\bacon.txt','C:\eggs')
    'C:\eggs\bacon.txt'
    

      值得注意的是:假如在 destination 中已经存在一个文件bacon.txt,它就会被覆写

       destination 路径也可以指定一个文件名。

    >>>shutil.move('C:\bacon.txt','C:\eggs\new_bacon.txt')    #将被移动并改名,若new_bacon.txt不存在将会新建
    C:\eggs\new_bacon.txt'
    

      更值得注意的是:前面都假设 eggs 文件夹存在,假如不存在, move() 就会将bacon.txt改名,变成名为eggs的文件

    >>>shutil.move('C:\bacon.txt','C:\eggs’)  
    ‘C:\eggs’
    

      这里 move() 在C:目录下找不到名为eggs的文件夹,所以python会假定 destination 指的是一个文件,而非文件夹所以bacon.txt文本文件将被改名为eggs(没有.txt文件扩展名的文本文件),这会成为程序中很难发现的缺陷,

      最后,构成目的地的文件夹必须已经存在,否则Python会抛出异常 FileNotFoundError: [Errno 2]  

    1.3永久删除文件和文件夹

      利用 os 模块中的函数,可以删除一个文件或一个空文件夹。利用 shutil 模块,可以删除一个文件夹及其所有的内容。

      用 os.unlink(path) 将删除path处的文件

      用 os.rmdir(path) 将删除path处的文件夹。但是该文件夹必须为空

      用 shutil.rmtree(path) 将删除path处的文件夹,包括它所包含的内容

    1.4用send2trash模块安全的删除

       shutil.rmtree() 函数的操作是不可逆的,或许我们疏忽的时候就会造成无法挽回的损失,跑路或许是一段不一样的人生历程,或许会有诗和远方,但是更遥远的地方,除了遥远一无所有,代码不规范,亲人两行泪也不是不可能

       send2trash (这个2一定是用和与to同音之意,没错,我又犯了那个毛病)模块会将删除的文件发送到计算机的回收站

    >>> send2trash.send2trash('test.txt')

    二、遍历目录树

       os.work(path) 是这一小节的猪脚,他每一次出发,完事后都会留下三个孩子,然后深藏功与名,一次,只需要一次就能遍历所有的,不用担心二级文件夹里的

      当前文件夹名称的字符串、当前文件夹中子文件夹的字符串的列表、当前文件夹中文件的字符串的列表

    for folderName,subfolders,filenames in os.walk(path):
        print('*'*10+'The current folder is:'+folderName)
        print(subfolders)
        print(filenames)
    

      运行结果

    **********The current folder is:C:UsersAdministrator.SC-201605202132AppDataLocalProgramsPythonPython37forTest
    ['adb_backup']  #forTest下的文件夹
    ['test.dir', 'test.txt', '用于python文件操作测试.txt']  #forTest下的文件
     
    **********The current folder is:C:UsersAdministrator.SC-201605202132AppDataLocalProgramsPythonPython37forTestadb_backup
    []  #adb_backup下的文件夹,这里为空说明里面没有文件夹了
    ['acp.exe', 'adb.exe', 'AdbWinApi.dll', 'AdbWinUsbApi.dll', 'android.bat', 'androidusb.sys', 'androidusb86.cat']  #adb_backup下的文件

    三、用zipfile模块压缩文件

    3.1读取ZIP文件

      要读取ZIP文件的内容,首先要创建一个ZipFile对象,这通过 zipfile.ZipFile() (这在概念上与File对象类似)

    forTestZip=zipfile.ZipFile('forTest.zip')  #创建ZipFile对象
    

       namelist() 返回ZIP文件中包含的所有文件和文件夹的字符串的列表

       getinfo(filename) 返回一个filename的ZipInfo对象,这个对象的属性包括表示字节数的 file_name 和 compress_size ,分别表示原来的文件大小和压缩后的文件大小

      ZipFile对象表示整个归档文件,而ZipInfo对象则保存该归档文件中每个文件有用的信息

    forTestZip=zipfile.ZipFile('forTest.zip')
    print(forTestZip.namelist())    
    testInfo=forTestZip.getinfo(forTestZip.namelist()[4])
    print(testInfo.file_size)
    print(testInfo.compress_size)
    forTestZip.close()
    

      结果:

    ['test.dir', 'test.txt',  'adb_backup/WdfCoInstaller01005.dll', 'adb_backup/zipalign.exe']
    43684
    14630

    3.2从ZIP文件中解压缩

      ZipFile对象有两个方法去解压文件,他们分别是 extractall() 和  extract() 前者从ZIP文件中解压缩所有的文件和文件夹,后者从ZIP文件中解压缩单个文件

    >>>import zipfile,os
    >>>exampleZip=zipfile.ZipFile('example.zip')
    >>>exampleZip.extractall('C:\toSave')    #会将解压文件保存到这个目录里,若不存在将会创建这个文件夹,参数为空,会保存到当前目录中
    >>>exampleZip.close()
    #extract()方法
    >>>exampleZip.extractall(‘spam.txt’,'C:\toSave')  #关于第一个参数,其必须存在与namelist()返回的字符串列表当中,换言之,他必须存在;关于第二个参数,extractall()有相同的规则
    >>>'C:\toSave\spam.txt'  #返回被解压缩后的绝对路径

      

    3.3创建和添加到ZIP文件

      要创建压缩文件,必须以“写模式”打开ZipFile对象,即传入‘w’作为第二个参数,然后调用ZipFile对象的 write(parameter1,parameter2) 方法,第一个参数代表要添加的文件名,第二个是压缩类型参数,他告诉计算机要以什么样的算法来压缩文件。可以总是将这个值设置为 zipfile.ZIP_DEFLATED (这指定了deflat压缩算法,对各类型的数据都很有效)

    >>>import zipfile
    >>>newZip=zipfile.ZipFile('newZip.zip','w')  #创建名为newZip的压缩文件,并以写模式打开
    >>>newZip.write('example.exe',compress_type=zipfile.ZIP_DEFLATE)  #向其中添加‘example.exe’文件
    >>>newZip.close()
    

      写模式将清除ZIP文件原有的内容。如果只希望将文件添加到原有的ZIP文件中,可以用“添加模式”打开,即

    >>>newZip=zipfile.ZipFile('newZip.zip','a')  #创建名为newZip的压缩文件,并以添加模式打开
    

      

      学习中遇见的问题:

      在打印 namelist() 返回的文件名时出现了乱码,并且在解压时也出现了,没去解决

    >>>import os,zipfile
    >>>newZip=zipfile.ZipFile('newZip.zip')
    >>>newZip.namelist()
    ['test.dir', 'test.txt', '╙├╙┌python╬─╝■▓┘╫≈▓Γ╩╘.txt', 'adb_backup/', 'adb_backup/acp.exe', 'adb_backup/adb.exe', 'adb_backup/AdbWinApi.dll']
    

     

    四、补充

      链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431925324119bac1bc7979664b4fa9843c0e5fcdcf1e000

       os.name 获取操作系统类型

       os.uname() 获取操作系统详细信息(Windows不提供)

      环境变量

        通过 os.environ 这个变量来查看系统中定义的环境变量  

        通过 os.environ.get('key') 来获取某个环境变量的详细信息

  • 相关阅读:
    【转】性能测试分享---java vuser协议(2)---LoadRunner篇
    【转】性能测试分享---java协议(1)------jemter篇
    windows下怎么修改mysql密码
    linux下怎么修改mysql的字符集编码默认分类
    java使用Redis2--保存对象
    java使用Redis1--安装与简单使用
    java实现hash一致性算法
    Redis Sentinel初体验
    Redis持久化实践及灾难恢复模拟
    Redis学习笔记
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10460477.html
Copyright © 2011-2022 走看看