파이썬에서 파일을 어떻게 복사합니까?
os
아래에서 아무것도 찾을 수 없습니다.
질문자 :Matt
파이썬에서 파일을 어떻게 복사합니까?
os
아래에서 아무것도 찾을 수 없습니다.
shutil
에는 사용할 수 있는 많은 방법이 있습니다. 그 중 하나는 다음과 같습니다.
from shutil import copyfile copyfile(src, dst) # 2nd option copy(src, dst) # dst can be a folder; use copy2() to preserve timestamp
src
파일의 내용을 dst
파일에 복사합니다. src
와 dst
는 모두 경로를 포함하여 파일의 전체 파일 이름이어야 합니다.IOError
예외가 발생합니다.dst
이미 존재하는 경우 대체됩니다.copy
사용하면 src
및 dst
str
지정된 경로 이름입니다. 살펴볼 또 다른 shutil
메서드는 shutil.copy2()
입니다. 비슷하지만 더 많은 메타데이터(예: 타임스탬프)를 보존합니다.
os.path
작업을 사용하는 경우 copyfile
copy
사용하십시오. copyfile
은 문자열만 허용합니다.
기능 | 사본 메타데이터 | 사본 권한 | 파일 객체 사용 | 목적지 디렉토리 일 수 있습니다 |
---|---|---|---|---|
셧틸.카피 | 아니요 | 예 | 아니요 | 예 |
셧틸.카피파일 | 아니요 | 아니요 | 아니요 | 아니요 |
셧틸.카피2 | 예 | 예 | 아니요 | 예 |
셧틸.카피파일오브제이 | 아니요 | 아니요 | 예 | 아니요 |
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
shutil
패키지의 복사 기능 중 하나를 사용할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 기능 보존 지원 다른 사본 허용 권한 디렉토리 대상. 파일 객체 메타데이터 ――――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――― shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ 셧틸.카피파일 ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
예시:
import shutil shutil.copy('/etc/hostname', '/var/tmp/testhostname')
Python에서는 다음을 사용하여 파일을 복사할 수 있습니다.
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)
파일 복사는 아래 예제와 같이 비교적 간단한 작업이지만 대신 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, ie 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 모듈을 사용하십시오.
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 방법의 철저한 치트 시트를 만들었습니다.
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',] }
둘째, 예를 들어 복사 방법을 설명하십시오.
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에 뿌리를 둔 전체 디렉토리 트리를 재귀적으로 복사하여 대상 디렉토리를 반환합니다.
작은 파일의 경우 Python 내장 기능만 사용하는 경우 다음 한 줄짜리를 사용할 수 있습니다.
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
@maxschlepzig가 아래 주석에서 언급했듯이 이것은 파일이 너무 크거나 메모리가 중요한 응용 프로그램에는 최적의 방법이 아니므로 Swati의 답변이 선호되어야 합니다.
os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
사용할 수 있습니다.
또는 내가 한 것처럼,
os.system('cp '+ rawfile + ' rawdata.dat')
여기서 rawfile
은 프로그램 내에서 생성한 이름입니다.
이것은 Linux 전용 솔루션입니다.
Python 3.5부터 작은 파일(예: 텍스트 파일, 작은 jpeg)에 대해 다음을 수행할 수 있습니다.
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
는 대상 위치에 있던 것을 덮어씁니다.
큰 파일의 경우 파일을 한 줄씩 읽고 각 줄을 배열로 읽는 것이 좋습니다. 그런 다음 배열이 특정 크기에 도달하면 새 파일에 추가합니다.
for line in open("file.txt", "r"): list.append(line) if len(list) == 1000000: output.writelines(list) del list[:]
subprocess.call
을 사용하여 파일 복사
from subprocess import call call("cp -p <file> <file>", shell=True)
open(destination, 'wb').write(open(source, 'rb').read())
읽기 모드에서 소스 파일을 열고 쓰기 모드에서 대상 파일에 씁니다.
모듈 없이 간단하게 할 수 있는 방법이 있습니다. 이 답변 과 비슷하지만 RAM에 맞지 않는 큰 파일인 경우에도 작동하는 이점이 있습니다.
with open('sourcefile', 'rb') as f, open('destfile', 'wb') as g: while True: block = f.read(16*1024*1024) # work by blocks of 16 MB if not block: # end of file break g.write(block)
새 파일을 작성 중이므로 수정 시간 등을 보존하지 않습니다.
필요한 경우 os.utime
위해 os.utime을 사용할 수 있습니다.
여기까지 왔다면. 대답은 전체 경로와 파일 이름이 필요하다는 것입니다.
import os shutil.copy(os.path.join(old_dir, file), os.path.join(new_dir, file))
허용된 답변과 유사하게 대상 경로에 존재하지 않는 폴더를 생성하려는 경우 다음 코드 블록이 유용할 수 있습니다.
from os import path, makedirs from shutil import copyfile makedirs(path.dirname(path.abspath(destination_path)), exist_ok=True) copyfile(source_path, destination_path)
허용된 답변에서 알 수 있듯이 이 행은 대상 경로에 존재하는 모든 파일을 덮어쓰므로 때로는 이 코드 블록 앞에 if not path.exists(destination_path):
Python은 운영 체제 셸 유틸리티를 사용하여 파일을 쉽게 복사할 수 있는 내장 기능을 제공합니다.
다음 명령은 파일 복사에 사용됩니다.
shutil.copy(src,dst)
다음 명령은 메타데이터 정보가 있는 파일을 복사하는 데 사용됩니다.
shutil.copystat(src,dst)
출처 : http:www.stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python
함수 데코레이터를 만들고 함께 연결하는 방법은 무엇입니까? (0) | 2021.10.27 |
---|---|
바이트를 문자열로 변환 (0) | 2021.10.27 |
private 함수나 private 메서드, 필드 또는 내부 클래스가 있는 클래스를 테스트하려면 어떻게 해야 합니까? (0) | 2021.10.27 |
목록이 비어 있는지 어떻게 확인합니까? (0) | 2021.10.27 |
Android에서 활동 시작 시 EditText가 포커스를 얻지 못하도록 하는 방법 (0) | 2021.10.26 |