Python [习题] 文件操作:目录间copy 文件
[习题] 指定一个源文件,实现copy到目标目录。
例如把/tmp/sample1.txt 拷贝到/tmp/sample2.txt
原文件需要有读权限(默认rt权限),目标文件需要给写(w即可)权限。
In [8]: with open('/tmp/sample1.txt',encoding='UTF-8') as f1:
...: with open('/tmp/sample2.txt','w',encoding='utf-8') as f2:
...: content = f1.read()
...: f2.write(content)
...:
In [9]: ls
C:\python\171025 的目录
2017/10/26 09:00 <DIR> .
2017/10/26 09:00 <DIR> ..
2017/10/25 19:20 13,099 sample1.txt
2017/10/26 09:01 13,099 sample2.txt
只拷贝了文件内容,文件元信息并未拷贝。
文件元信息是指文件的具体信息:
14:59:24 ⚡ root@ihoneysec ~
# stat optime.sh
文件:"optime.sh"
大小:5506 块:16 IO 块:4096 普通文件
设备:fd00h/64768d Inode:33579806 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2017-10-12 17:51:21.028568171 +0800
最近更改:2017-10-12 17:51:15.868567925 +0800
最近改动:2017-10-12 17:51:15.868567925 +0800
创建时间:-
文件元信息的复制
copyfileobj(fsrc, fdst[, length])
文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容。fdst要求可写。
length指定了表示buffer的大小;
copyfileobj:
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
In [35]: with open('test1','r+') as f1:
...: with open('test2','w') as f2:
...: f1.write('abcd\n1234') #文件指针移到末尾
...: f1.flush()
...: shutil.copyfileobj(f1,f2) #此时再读 f1 内容就是空了,所以copyfileobj copy生成的文件是空
...:
In [36]: ll
-rw-rw-r-- 1 python 9 10月 26 19:58 test1
-rw-rw-r-- 1 python 0 10月 26 19:58 test2
In [38]: !stat test1
文件:"test1"
大小:9 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:1423520 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ python) Gid:( 1000/ python)
最近访问:2017-10-26 19:58:00.061372104 +0800
最近更改:2017-10-26 19:58:00.061372104 +0800
最近改动:2017-10-26 19:58:00.061372104 +0800
创建时间:-
In [39]: !stat test2
文件:"test2"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:1423521 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ python) Gid:( 1000/ python)
最近访问:2017-10-26 19:58:00.061372104 +0800
最近更改:2017-10-26 19:58:00.061372104 +0800
最近改动:2017-10-26 19:58:00.061372104 +0800
创建时间:-
copyfile(src, dst, *, follow_symlinks=True)
复制文件内容,不含元数据。src、dst为文件的路径字符串
本质上是在调用 os.symlink 和 copyfileobj ,所以不带元数据复制。
copymode(src, dst, *, follow_symlinks=True)
只拷贝权限
copystat(src, dst, *, follow_symlinks=True)
从src复制所有文件状态信息(权限,atime,mtime,flag)到dst,follow_symlinks=True默认会跟踪复制原文件,如果设置为False,仅仅复制符号链接
copy(src, dst, *, follow_symlinks=True)
复制文件内容、权限和部分元数据,不包括创建数据和修改实际。
本质上调用的是copyfile和copymode:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copymode(src, dst, follow_symlinks=follow_symlinks)
copy2(src, dst, *, follow_symlinks=True)
copy2比copy多了复制全部元数据,但需要平台支持。
本质上调用的也是:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copymode(src, dst, follow_symlinks=follow_symlinks)
还有一点和copy的区别是copy函数检查如果源和目标都是相同的文件,会抛异常SameFileError ,而copy2不会。
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类型数据。
def ignore(src,names):
ig = filter(lambda x:x.startwith('a'),names) #忽略a
return set(ig)
shutil.copytree('/var/log/nginx','/tmp/ng_log',ignore=ignore)
rmtree(path, ignore_errors=False, onerror=None)
递归删除。如同rm -rf 一样危险,建议使用rm命令一定不要加-rf,再次考虑清楚再确定使用-rf。
它不是原子操作,有可能删除错误,就会中断,已经删除的就删除了。
ignore_error为true,忽略错误。当为False或者omitted时onerror生效。
onerror为callable,接受函数function、path和execinfo。
shutil.rmtree('/tmp/ng_log') #类似 rm -rf
move 移动
move(src, dst, copy_function=copy2)
递归移动文件、目录到目标,返回目标。
本身使用的时os.rename方法。
如果不支持rename,再判断如果是链接文件,则创建链接原文件到dst,然后删除src。
如果是目录则调用copytree递归复制到dst,再删除src目录,如果都不是,都调用copy2复制,在调用unlink删除(类remove)。
os.rename('/tmp/ng_log/nginx.log','/tmp/ng_log/nginx.log.bak20171026')
os.rename('php-fpm.log','/tmp/php-fpm.log')
Python [习题] 文件操作:目录间copy 文件的更多相关文章
- cmake指定程序输出目录和库文件输出目录和拷贝文件
概述 本文样式环境: win10+cmake 3.18 本文将介绍使用CMAKE配置项目输出目录和 LIbrary项目的输出目录 本文将介绍 cmake的file函数的基础用法之拷贝文件 重点, 这些 ...
- matlab文件操作及读txt文件(fopen,fseek,fread,fclose)
文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MATLAB提供了一系列低层输入输出函数,专门用于文件操作. 1.文件的打开与关闭 1)打开文件 在读写文件之前,必须先用f ...
- MATLAB文件操作及读txt文件
转自:http://blog.csdn.net/vblittleboy/article/details/8049748 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MA ...
- 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作
原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...
- python基础之 编码进阶,文件操作和深浅copy
1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码.即先将其他编码的字符串解码(decode)成unicode,再从unic ...
- python基础 (编码进阶,文件操作和深浅copy)
1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码. 即先将其他编码的字符串解码(decode)成unicode,再从uni ...
- 第9章 Python文件操作目录
第9章 Python文件操作 第9.1节 Python的文件打开函数open简介 第9.2节 Python的文件打开函数open详解 第9.3节 Python的文件行读取:readline 第9.4节 ...
- Python基础学习笔记---5.输入\输出 I\O文件操作目录
在很多时候,你会想要让你的程序与用户(可能是你自己)交互.你会从用户那里得到输入,然后打印一些结果.我们可以分别使用 raw_input 和 print 语句来完成这些功能.对于输出,你也可以使用多种 ...
- Python小白学习之路(十九)—【文件操作步骤】【文件操作模式】
一.文件操作步骤 step1:打开文件,得到文件句柄并赋值给一个变量step2:通过句柄对文件进行操作step3:关闭文件 举例: a = open('hello world', 'r', encod ...
随机推荐
- 成为一名Java高级工程师你需要学什么
宏观上: 1.技术广度方面至少要精通多门开源技术吧,研究过struts\spring等的源码.2.项目经验方面从头到尾跟过几个大项目,头是指需求阶段,包括需求调研.尾是指上线交付之后,包括维护阶段.3 ...
- Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程
事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...
- [Java第一课]环境变量的配置以及eclipse一些常用快捷键
1.环境变量的配置(这里对xp系统电脑来说:) 首先安装jdk软件. 然后在我的电脑(右键)-->属性-->高级-->环境变量-->系统变量(注意)-->新建(新建两个p ...
- MongoDB监控
1. mongostat:间隔固定时间获取mongodb的当前运行状态,并输出. 使用示例: D:\Program_Files\MongoDB\bin\mongostat(根据MongoDB的安装目录 ...
- 一段批处理脚本(for 嵌套)
需求: 1.服务器上有一堆按日期生成的目录,已经有N个月了,需要只取当前月份的目录. 2.目录中有一系列文件,文件名字不一样,但存在一定的重复规律. 3.需要从服务器上拷贝文件到本地,自动去重,拷贝到 ...
- celery rabbit mq 详解
Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...
- 腾讯云VS AWS :云存储网关性能谁更优?
p { text-indent: 2em } 随着企业规模的扩大及业务的扩展,现有IT基础设施特别是存储设备无法满足爆炸性的数据增长,企业 IT 部门为了解决该问题,往往面临市场上多种存储产品及 ...
- iOS之 NSTimer(一)
以前没怎么了解过这个NSTimer,其实还是有挺多坑的,今天来总结一下: 首先我们一起来看这个: 我在A -> (push) -> B控制器,然后再B控制器中开启了一个NSTimer.然 ...
- 安装PyQt5之后mayavi和VTK不能使用
mayavi在显示数据的过程中需要调用PyQt4的GUI方法产生应用框架.但是新发布的PyQt5和PyQt4在很多方面都是不兼容的,这也就导致了用mayavi编写的程序运行失败.在实践之后,我的解决方 ...
- 2456: mode
2456: mode Time Limit: 1 Sec Memory Limit: 1 MBSubmit: 4798 Solved: 2009[Submit][Status][Discuss] ...