답변:
shutil
사용할 수있는 방법이 많이 있습니다. 그 중 하나는 다음과 같습니다.
from shutil import copyfile
copyfile(src, dst)
당신이 사용하는 경우 os.path
작업을 사용 copy
하기보다는 copyfile
. copyfile
것입니다 만 문자열을 받아 들일 .
~
할 수 없지만 상대 경로를 처리 할 수 있습니다.
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ Function │ Copies │ Copies │Can use│ Destination │
│ │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
copy2(src,dst)
종종 다음보다 더 유용합니다 copyfile(src,dst)
.
dst
될 디렉토리 (대신의 전체 대상 파일 이름을)하는 경우에는 기본 이름 의 src
새 파일을 만드는 데 사용됩니다;다음은 간단한 예입니다.
import shutil
shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given
shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext
copyfile
보다 빠른 속도copy2
shutil.copy2('/dir/file.ext', '/new/dir/')
대상"경로 뒤에 슬래시를 사용하여 "dir"이라는 새 파일로 복사 할 것인지 또는 해당 이름의 디렉토리에 파일을 넣을 것인지에 대한 모호성을 제거 한다고 가정하는 것이 맞 습니까?
/new/dir
기존 디렉토리 인 경우 모호성이 없습니다 . @MatthewAlpert의 의견을 참조하십시오.
/new/dir/
존재하지 않는, 파이썬은 발생합니다 IsADirectoryError
에, 그렇지 않으면 복사 파일을 /new/dir/
원래의 이름으로.
shutil
패키지 에서 복사 기능 중 하나를 사용할 수 있습니다 .
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 유지 기능은 다른 사본을 허용합니다. 권한 디렉토리 대상. 파일 obj 메타 데이터 ―――――――――――――――――――――――――――――――――――――――――――――――――――――― ―――――――――――――――――――――――――――――― shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ shutil.copyfile ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
예:
import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
파이썬에서는 다음을 사용하여 파일을 복사 할 수 있습니다
shutil
구성 단위os
구성 단위subprocess
구성 단위import os
import shutil
import subprocess
shutil
모듈을 이용한 파일 복사shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile('source.txt', 'destination.txt')
shutil.copy
서명
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy('source.txt', 'destination.txt')
shutil.copy2
서명
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2('source.txt', 'destination.txt')
shutil.copyfileobj(src_file_object, dest_file_object[, length])
# example
file_src = 'source.txt'
f_src = open(file_src, 'rb')
file_dest = 'destination.txt'
f_dest = open(file_dest, 'wb')
shutil.copyfileobj(f_src, f_dest)
os
모듈을 이용한 파일 복사os.popen
서명
os.popen(cmd[, mode[, bufsize]])
# example
# In Unix/Linux
os.popen('cp source.txt destination.txt')
# In Windows
os.popen('copy source.txt destination.txt')
os.system
서명
os.system(command)
# In Linux/Unix
os.system('cp source.txt destination.txt')
# In Windows
os.system('copy source.txt destination.txt')
subprocess
모듈을 이용한 파일 복사subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True)
# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)
# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)
['copy', sourcefile, destfile]
, 특히 매개 변수가 사용자 입력에서 제공되는 경우 가능하면 구문 을 사용 하십시오.
os.popen
한동안 더 이상 사용되지 않습니다. 및 check_output
상태지만 (의 경우 비어있는 출력을 반환하지 않습니다 copy/cp
)
파일 복사는 아래 예제와 같이 비교적 간단한 작업이지만 대신 shutil stdlib 모듈 을 사용해야합니다.
def copyfileobj_example(source, dest, buffer_size=1024*1024):
"""
Copy a file from source to dest. source and dest
must be file-like objects, i.e. any object with a read or
write method, like for example StringIO.
"""
while True:
copy_buffer = source.read(buffer_size)
if not copy_buffer:
break
dest.write(copy_buffer)
파일 이름으로 복사하려면 다음과 같이하십시오.
def copyfile_example(source, dest):
# Beware, this example does not handle any edge cases!
with open(source, 'rb') as src, open(dest, 'wb') as dst:
copyfileobj_example(src, dst)
shutil.copyfileobj
. 또한 try, finally
예외 후에 파일 닫기를 처리 할 필요가 없습니다 . 그러나 나는 함수가 파일을 열고 닫는 책임을지지 않아야한다고 말하고 싶습니다. shutil.copyfile
wraps 와 같은 래퍼 함수에 있어야합니다 shutil.copyfileobj
.
dest
쓰기 가능하도록 지정 해야합니다.open(dest, 'wb')
shutil 모듈을 사용하십시오 .
copyfile(src, dst)
src라는 파일의 내용을 dst라는 파일로 복사하십시오. 대상 위치는 쓰기 가능해야합니다. 그렇지 않으면 IOError 예외가 발생합니다. dst가 이미 존재하면 교체됩니다. 문자 또는 블록 장치 및 파이프와 같은 특수 파일은이 기능으로 복사 할 수 없습니다. src 및 dst는 문자열로 지정된 경로 이름입니다.
표준 Python 모듈에서 사용 가능한 모든 파일 및 디렉토리 처리 기능에 대해서는 filesys 를 살펴보십시오 .
디렉토리 및 파일 복사 예제-Tim Golden의 Python Stuff :
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
import os
import shutil
import tempfile
filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2
shutil.copy (filename1, filename2)
if os.path.isfile (filename2): print "Success"
dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2
shutil.copytree (dirname1, dirname2)
if os.path.isdir (dirname2): print "Success"
먼저, 나는 당신의 참고를 위해 철저한 셔틀 메소드 치트 시트를 만들었습니다.
shutil_methods =
{'copy':['shutil.copyfileobj',
'shutil.copyfile',
'shutil.copymode',
'shutil.copystat',
'shutil.copy',
'shutil.copy2',
'shutil.copytree',],
'move':['shutil.rmtree',
'shutil.move',],
'exception': ['exception shutil.SameFileError',
'exception shutil.Error'],
'others':['shutil.disk_usage',
'shutil.chown',
'shutil.which',
'shutil.ignore_patterns',]
}
둘째, exmaples에서 복사 방법을 설명하십시오.
shutil.copyfileobj(fsrc, fdst[, length])
열린 객체 조작
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
...: shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
shutil.copyfile(src, dst, *, follow_symlinks=True)
복사 및 이름 바꾸기
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
shutil.copy()
메타 데이터를 미리 보지 않고 복사
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
shutil.copy2()
메타 데이터를 미리 삽입하여 복사
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
shutil.copytree()
src를 기반으로하는 전체 디렉토리 트리를 재귀 적으로 복사하여 대상 디렉토리를 리턴합니다.
작은 파일과 파이썬 내장 기능 만 사용하는 경우 다음의 한 줄짜리를 사용할 수 있습니다.
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
아래 주석에 언급 된 @ maxschlepzig와 같이 파일이 너무 크거나 메모리가 중요한 응용 프로그램에는 최적의 방법이 아니므로 Swati의 대답이 선호됩니다.
.read()
하고 .write()
기본적으로 버퍼링되어 있습니다 (적어도 CPython의 경우).
open()
때문에 기본적으로 IO를 버퍼링 않습니다가, 여기에 도움이되지 않습니다 read()
으로 지정됩니다 '. n은 부정적이나, EOF 때까지 읽기를 생략하면' 즉 read()
, 전체 파일 내용을 문자열로 반환합니다.
당신은 사용할 수 있습니다 os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
또는 내가 한 것처럼
os.system('cp '+ rawfile + ' rawdata.dat')
rawfile
프로그램 내에서 생성 한 이름은 어디에 있습니까 ?
이것은 Linux 전용 솔루션입니다
shutil
사용할 수없는 경우에도 subprocess.run()
( shell=True
! 없이 )가 더 나은 대안 os.system()
입니다.
subprocess.run()
@maxschlepzig가 제안한 것처럼 외부 프로그램을 호출 할 때 큰 발전입니다. 그러나 유연성과 보안 ['cp', rawfile, 'rawdata.dat']
을 위해 명령 행을 전달하는 형식을 사용하십시오 . (단, shutil
외부 프로그램을 호출하는 것보다 복사 및 친구에게 권장됩니다.)
큰 파일의 경우 파일을 한 줄씩 읽고 각 줄을 배열로 읽습니다. 그런 다음 배열이 특정 크기에 도달하면 새 파일에 추가하십시오.
for line in open("file.txt", "r"):
list.append(line)
if len(list) == 1000000:
output.writelines(list)
del list[:]
for l in open('file.txt','r'): output.write(l)
찾아야한다. 출력 스트림 버퍼를 필요에 맞게 설정하십시오. 또는 한 번에 쓰고 싶은 바이트 수는 output.write(read(n)); output.flush()
어디 에서 try를 반복하여 바이트 수만큼 갈 수 있습니다 n
. 둘 다 또한 어느 것이 보너스인지 확인할 조건이 없습니다.
shutil
합니까? 무시할 때에도 shutil
(버퍼링되지 않은 IO를 사용하는) 간단한 블록 읽기 / 쓰기 루프는 간단하고 효율적이며 이보다 훨씬 더 의미가있어 가르치고 이해하기가 더 쉽습니다.
from subprocess import call
call("cp -p <file> <file>", shell=True)
call
것은 안전하지 않습니다. 이에 대한 서브 프로세스 문서를 참조하십시오.
현재 파이썬 3.5 (: 텍스트 파일, 작은 사진과 예) 당신은 작은 파일에 대해 다음 작업을 수행 할 수 있습니다 :
from pathlib import Path
source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())
write_bytes
대상 위치에 있던 모든 것을 덮어 씁니다.
shutil
모든 특수한 경우를 처리하고 마음의 평화를 얻을 수 있습니다.
open(destination, 'wb').write(open(source, 'rb').read())
소스 파일을 읽기 모드로 열고 대상 파일에 쓰기 모드로 씁니다.
.close()
그 모든 것을 놓치고 있지 open(...)
않습니까?
Python은 운영 체제 셸 유틸리티를 사용하여 파일을 쉽게 복사 할 수있는 내장 함수를 제공합니다.
다음 명령은 파일을 복사하는 데 사용됩니다
shutil.copy(src,dst)
다음 명령은 메타 데이터 정보가있는 파일을 복사하는 데 사용됩니다
shutil.copystat(src,dst)
copy
그런 다음 copystat
파일 메타 데이터를 보존하기 위해 실행해야합니다 . Python 3.3 copystat
이상에서는 확장 된 속성도 복사합니다.