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\n1234")
    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:\Anaconda3\lib\shutil.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:\Anaconda3\lib\codecs.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:\tt\e\b
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。

猜你喜欢

转载自www.cnblogs.com/xpc51/p/11748676.html