• python os模块和shutil模块


    操作系统平台属性或者方法

    os.name:Windows是nt,linux是POSIX。

    os.uname(),linux显示

    sys.platform,window显示win32,linux显示Linux。

    os.listdir("o:/temp"),返回目录内容列表。

    os也有open,read,write方法,但是太低级,建议使用内建函数open,read,write方法,使用方法相似。

    shutil模块

    之前学习的文件拷贝,是使用打开两个文件对象,然后源文件读取内容,写入目标文件中来完成拷贝过程,但是这样丢失stat数据信息(权限)等,因为根本没有复制这些信息过去。目录复制应该怎么办?Python提供了一个方便的库shutil(高级文件操作)

    copy复制

    copyfileobj(fsrc,fdst,length),文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容,fdst要求可写。length指定了buffer的大小。

    import shutil
    with open("test1.txt",mode = "r+",encoding = "utf-8") as f1:
        f1.write("abcd
    1234")
        f1.flush()
        with open("test2.txt",mode = "w+",encoding = "utf-8") as f2:
            shutil.copyfileobj(f1,f2)
    
    结果为:
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-23-36d248eaac3f> in <module>
          4     f1.flush()
          5     with open("test2.txt",mode = "w+",encoding = "utf-8") as f2:
    ----> 6         shutil.copyfileobj(f1,f2)
    
    f:Anaconda3libshutil.py in copyfileobj(fsrc, fdst, length)
         77     """copy data from file-like object fsrc to file-like object fdst"""
         78     while 1:
    ---> 79         buf = fsrc.read(length)
         80         if not buf:
         81             break
    
    f:Anaconda3libcodecs.py in decode(self, input, final)
        320         # decode input (taking the buffer into account)
        321         data = self.buffer + input
    --> 322         (result, consumed) = self._buffer_decode(data, self.errors, final)
        323         # keep undecoded input until the next call
        324         self.buffer = data[consumed:]
    
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9d in position 0: invalid start byte

     copyfile(src,dst,*,follow-symlinks = True)

    复制文件内容,不含元数据,src,dst为文件的路径字符串。

    本质上调用的是copyfileobj,所以不带元数据二进制内容复制。

    copymode(src,dst*,follow_symlinks = True)

    仅仅复制权限。

    copystat(src,dst,*,follow_symlinks = True)

    复制元数据,stat包含权限。

     copy(src,dst,*,follow_symlinks =True)

    复制文件内容,权限和部分元数据,不包括创建时间和修改时间。

    本质上调用的是

    copyfile(src,dst,fillow_symlinks)

    copymode(src,dst,follow_symlinks = follow_symlinks)

    copy2比copy多了复制全部元数据,但需要平台支持。

    本质上调用的是

    copyfile(src,dst,fillow_symlinks = follow_symlinks)

    copystat(src,dst,follow_symlinks = follow_symlinks)

    copytree(src,dst,symlinks = True,ignore = Noe,copy_function = copy2,ignore_dangling_symlinks = False)递归复制目录。默认使用copy2,也就是带更多的元数据复制。

    src.dst必须是目录,src必须存在,dst必须不存在。

    ignore = func,提供一个callable(src,name)->ignore_names。提供一个函数,它会被调用,src是源目录,names是os.listdir(src)的结果,就是列出src的文件名,返回值是要被过滤的文件名的src类型数据。

    import shutil
    
    #f盘xpc下有a,b目录
    
    def ignore(src,names):
        ig = filter(lambda x:x.startswith("a"),names)#忽略a
        return set(ig)
    
    shutil.copytree("e:/xpc","e:/tt/e",ignore=ignore)
    
    结果为:
    E:	te
    e盘下tt目录下的e目录复制了b目录,a被忽略。

    rm删除

    shutil.rmtree(path,ignore_errors = False,onerror = None)

    递归删除,如同rm-rf一样危险,慎用。

    它不是院子操作,有可能删除错误,就会中断,已经删除的就删除了。

    ignore_errores为True,忽略错误,当为False或者omitted时onerror生效。

    onerror为callable,接受函数function、path、execinfo。

    shutil.rmtree("f:xpc")#类似rm -rf

    move移动

    move(src,dst,copy_function = copy2)

    递归移动文件、目录到目标,返回目标。

    本身使用的是os.rename方法。

    如果不支持rename,如果是目录则想copytree再删除源目录。

    默认使用copy2方法。

     shutil还有打包功能,生成tar并压缩,支持zip,gz.bz,xz。

  • 相关阅读:
    jQuery插件开发——元素拖拽和基于鼠标位置为中心缩放
    基于Quartz.Net的任务管理平台开发(3) —— 任务管理平台
    记录一下Linq实现多列排序的问题
    动态构造Lambda表达式
    MVC全局实现异常处理
    修改自增列起始值,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'******'中的标识列指定显式值
    统计指定时间段内生日的用户
    SQL开关功能记录
    枚举对象实现 DropDownList 的转换操作二
    枚举对象实现 DropDownList 的转换操作一
  • 原文地址:https://www.cnblogs.com/xpc51/p/11748676.html
Copyright © 2020-2023  润新知