zoukankan      html  css  js  c++  java
  • Python中文件操作2——shutil模块

    1 文件操作

      文件有很多的操作,之前的文件操作中介绍了内建函数对文件的打开、读取以及写入,这三种操作是对文件基本的使用。文件还有复制、删除、移动、改变文件的属主属组等操作。下面主要看os模块和shutil模块提供的对文件操作的方法。

    2 os模块

      os模块中也有open、read、write方法,但是太低级,建议使用内建函数open、read、write,二者使用方法相似。以下是os模块提供的对文件操作的相关属性和方法:

    属性或方法 功能
    os.name 返回操作系统类型,windows是nt,Linux是posix。
    os.uname() 返回操作系统信息,*nix支持。
    os.listdir('o:/temp') 返回目录内容列表。

    os.stat(path, *, dir_fd=None,

    follow_symlinks=Ture)

    该方法的本质是调用linux系统的stat命令。

    path: 路径的string或bytes,或fd文件描述符。

    follow_symlinks: True返回文件本身信息,False且如果是软链接

    则显示软链接本身。

    os.chmod(path, mode, *, dir_fd=None,

    follow_symlinks=True)

    改变文件权限,例如os.chmod('test', 0o777)
    os.chown(path, uid, gid) 该文件的属主、属组,但是需要足够的权限

    3 shutil模块

      通过前面介绍的一些文件操作的方法,使用打开两个文件对象,读取源文件内容,然后将内容写入目标文件中来完成文件拷贝过程。但是这样会丢失stat数据信息(权限等),因为根本没有复制这些信息过去。Python提供了一个高级文件操作shutil库,下面来看下,shutil库中提供的操作文件的方法。

    3.1 copy复制

    • copyfileobj(fsrc, fdst[, length])

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

    1 import shutil
    2 
    3 with open('test.txt', 'w+') as f1:
    4     f1.write('abcd
    1234')
    5     f1.flush()
    6     print(f1.tell())
    7     f1.seek(0)  # 在f1文件写入内容后文件指针会指向文件末尾,此时要将文件指针指向文件头,才能完成下面的复制过程
    8     with open('test1.txt', 'w+') as f2:
    9         shutil.copyfileobj(f1, f2)
    View Code
    • copyfile(src, dst, *, follow_symlinks=True)

      复制文件内容,不含元数据。src、dst为文件的路径字符串,返回目标文件路径。本质上调用的就是copyfileobj,所以不带元数据二进制内容复制。注意:该方式的copy会覆盖目标文件。

    1 f = shutil.copyfile('test.txt', 'test1.txt')
    2 print(f)
    View Code
    • copymode(src, dst, *, follow_symlinks=True)

      仅仅复制文件的权限。

    1 shutil.copymode('test.txt', 'test1.txt')
    2 print(os.stat('test.txt'))
    3 print(os.stat('test1.txt'))
    View Code
    • copystat(src, dst, *, follow_symlinks=True)

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

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

      复制文件内容、权限和部分元数据,不包括创建时间和修改时间。本质上调用的是copyfile和copymode。

    • copy2(src, dst, *, follow_symlinks=True)

      copy2比copy多了复制全部元数据,但是需要平台支持。本事上调用copyfile和copystat。

    • copytree(src, dst, *, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)

      递归复制目录。默认使用copy2,也就是带更多元数据的复制。src、dst必须是目录,src必须存在,dst必须不存在;ignore = func,提供callable(src, names) --> ignored_names。提供一个函数,它会被调用。src是源目录,names是os.listdir(src)的结果,就是列出src中的文件名,返回值是要被过滤的文件的set类型数据。

    1 # o:/temp下有a、b目录
    2 def ignore(src, names):
    3     ig = filter(lambda x: x.startswith('a'), names)    # 忽略a
    4     return set(ig)
    5 
    6 shutil.copytree('o:/temp', 'o:/tt/o', ignore=ignore)
    View Code

    3.2 rm删除

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

      递归删除。如同rm -rf一样危险,慎用。rmtree不是原子操作,有可能删除错误,就会中断,已经删除的就删除了。ignore_errors为true,忽略错误。当为False或者omitted时onerror生效;onerror为callable,接受函数function、path和execinfo。

    shutil.rmtree('o:/tmp')    # 类似rm -rf

    3.3 move移动

    •  move(src, dst, copy_function=copy2)

      递归移动文件、目录到目标路径下,返回目标路径。其本质使用的是os.rename方法,如果不支持rename及移动的是目录则先copytree然后再删除源目录。默认使用copy2方法。

  • 相关阅读:
    fastcgi(一)
    矩阵旋转运算(一)
    【10.9】multiprocessing多进程编程
    【10.8】多线程和多进程的比较
    【10.7】ThreadPoolExecutor线程池
    【10.6】线程同步--Semaphore 使用以及源码分析
    【10.5】线程同步--conditon 使用以及源码分析
    【10.4】线程同步--Lock、RLock
    【10.3】线程间通信--共享变量和Queue
    【10.2】多线程编程-threading
  • 原文地址:https://www.cnblogs.com/dabric/p/11757057.html
Copyright © 2011-2022 走看看