etc./StackOverFlow

파이썬에서 파일을 어떻게 복사합니까?

청렴결백한 만능 재주꾼 2021. 10. 27. 23:23
반응형

질문자 :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 파일에 복사합니다. srcdst 는 모두 경로를 포함하여 파일의 전체 파일 이름이어야 합니다.
  • 대상 위치는 쓰기 가능해야 합니다. 그렇지 않으면 IOError 예외가 발생합니다.
  • dst 이미 존재하는 경우 대체됩니다.
  • 캐릭터나 블록 디바이스, 파이프 등의 특수 파일은 이 기능으로 복사할 수 없습니다.
  • copy 사용하면 srcdst str 지정된 경로 이름입니다.

살펴볼 또 다른 shutil 메서드는 shutil.copy2() 입니다. 비슷하지만 더 많은 메타데이터(예: 타임스탬프)를 보존합니다.

os.path 작업을 사용하는 경우 copyfile copy 사용하십시오. copyfile 은 문자열만 허용합니다.


Swati

기능 사본
메타데이터
사본
권한
파일 객체 사용 목적지
디렉토리 일 수 있습니다
셧틸.카피 아니요 아니요
셧틸.카피파일 아니요 아니요 아니요 아니요
셧틸.카피2 아니요
셧틸.카피파일오브제이 아니요 아니요 아니요

jezrael

copy2(src,dst) 는 종종 다음과 같은 이유로 copyfile(src,dst) 보다 더 유용합니다.

  • dst 가 (전체 대상 파일 이름 대신에) 디렉토리 가 될 수 있도록 src 의 기본 이름 은 새 파일을 만드는 데 사용됩니다.
  • 파일 메타데이터의 원래 수정 및 액세스 정보(mtime 및 atime)를 유지합니다(그러나 약간의 오버헤드가 있음).

다음은 짧은 예입니다.

 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

unmounted

shutil 패키지의 복사 기능 중 하나를 사용할 수 있습니다.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
기능 보존 지원 다른 사본 허용
                      권한 디렉토리 대상. 파일 객체 메타데이터  
――――――――――――――――――――――――――――――――――――――――――――――――― ―――――――――――――――――――――――――――
shutil.copy ✔ ✔ ☐ ☐
shutil.copy2 ✔ ✔ ☐ ✔
셧틸.카피파일 ☐ ☐ ☐ ☐
shutil.copyfileobj ☐ ☐ ✔ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

예시:

 import shutil shutil.copy('/etc/hostname', '/var/tmp/testhostname')

maxschlepzig

Python에서는 다음을 사용하여 파일을 복사할 수 있습니다.


 import os import shutil import subprocess

shutil 모듈을 이용한 파일 복사

shutil.copyfile 서명

 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 서명

 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 서명

 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 서명

 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)


kmario23

파일 복사는 아래 예제와 같이 비교적 간단한 작업이지만 대신 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)

pi.

shutil 모듈을 사용하십시오.

 copyfile(src, dst)

src라는 파일의 내용을 dst라는 파일에 복사합니다. 대상 위치는 쓰기 가능해야 합니다. 그렇지 않으면 IOError 예외가 발생합니다. dst가 이미 존재하는 경우 대체됩니다. 캐릭터나 블록 디바이스, 파이프 등의 특수 파일은 이 기능으로 복사할 수 없습니다. src 및 dst는 문자열로 지정된 경로 이름입니다.

표준 Python 모듈에서 사용할 수 있는 모든 파일 및 디렉토리 처리 기능에 대해서는 filesys 를 살펴보십시오.


Airsource Ltd

디렉토리 및 파일 복사 예 - 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"

Noam Manos

첫째, 나는 당신의 참조를 위해 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',] }

둘째, 예를 들어 복사 방법을 설명하십시오.

  1. 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)
  1. 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
  1. 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
  1. 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
  1. shutil.copytree()

src에 뿌리를 둔 전체 디렉토리 트리를 재귀적으로 복사하여 대상 디렉토리를 반환합니다.


AbstProcDo

작은 파일의 경우 Python 내장 기능만 사용하는 경우 다음 한 줄짜리를 사용할 수 있습니다.

 with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

@maxschlepzig가 아래 주석에서 언급했듯이 이것은 파일이 너무 크거나 메모리가 중요한 응용 프로그램에는 최적의 방법이 아니므로 Swati의 답변이 선호되어야 합니다.


fabda01

os.system('cp nameoffilegeneratedbyprogram /otherdirectory/') 사용할 수 있습니다.

또는 내가 한 것처럼,

 os.system('cp '+ rawfile + ' rawdata.dat')

여기서 rawfile 은 프로그램 내에서 생성한 이름입니다.

이것은 Linux 전용 솔루션입니다.


mark

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 는 대상 위치에 있던 것을 덮어씁니다.


Marc

큰 파일의 경우 파일을 한 줄씩 읽고 각 줄을 배열로 읽는 것이 좋습니다. 그런 다음 배열이 특정 크기에 도달하면 새 파일에 추가합니다.

 for line in open("file.txt", "r"): list.append(line) if len(list) == 1000000: output.writelines(list) del list[:]

ytpillai

subprocess.call 을 사용하여 파일 복사

 from subprocess import call call("cp -p <file> <file>", shell=True)

deepdive

open(destination, 'wb').write(open(source, 'rb').read())

읽기 모드에서 소스 파일을 열고 쓰기 모드에서 대상 파일에 씁니다.


Sundeep471

모듈 없이 간단하게 할 수 있는 방법이 있습니다. 이 답변 과 비슷하지만 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을 사용할 수 있습니다.


Basj

여기까지 왔다면. 대답은 전체 경로와 파일 이름이 필요하다는 것입니다.

 import os shutil.copy(os.path.join(old_dir, file), os.path.join(new_dir, file))

Leonardo Wildt

허용된 답변과 유사하게 대상 경로에 존재하지 않는 폴더를 생성하려는 경우 다음 코드 블록이 유용할 수 있습니다.

 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):


R J

Python은 운영 체제 셸 유틸리티를 사용하여 파일을 쉽게 복사할 수 있는 내장 기능을 제공합니다.

다음 명령은 파일 복사에 사용됩니다.

 shutil.copy(src,dst)

다음 명령은 메타데이터 정보가 있는 파일을 복사하는 데 사용됩니다.

 shutil.copystat(src,dst)

Savai Maheshwari

출처 : http:www.stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python

반응형