操作系统平台属性或者方法
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。