python 상황 - 파이썬으로 파일을 어떻게 복사합니까?




이동 폴더 (13)

파이썬으로 파일을 어떻게 복사합니까?

나는 os 아래에서 아무것도 찾을 수 없었다.


Answers

┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐
│     Function     │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│
├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤
│shutil.copy       │      No       │        Yes       │    No        │    Yes    │
│shutil.copyfile   │      No       │        No        │    No        │    No     │
│shutil.copy2      │      Yes      │        Yes       │    No        │    Yes    │
│shutil.copyfileobj│      No       │        No        │    Yes       │    No     │
└──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function              preserves     supports          accepts     copies other
                      permissions   directory dest.   file obj    metadata  
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
shutil.copy              ✔             ✔                 ☐           ☐
shutil.copy2             ✔             ✔                 ☐           ✔
docs.python.org/3/library/shutil.html#shutil.copyfile          ☐             ☐                 ☐           ☐
shutil.copyfileobj       ☐             ☐                 ✔           ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

예:

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

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

대용량 파일의 경우, 내가 한 일은 파일을 한 줄씩 읽고 각 줄을 배열로 읽는 것입니다. 그런 다음 배열이 특정 크기에 도달하면 새 파일에 추가하십시오.

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

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

또는 내가 그랬던 것처럼,

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

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

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


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

  • dst 는 (완전한 타겟 파일명 대신에) 디렉토리 가 될 수있다.이 경우 srcbasename 이 새로운 파일을 생성하는데 사용된다;
  • 파일 메타 데이터에서 원본 수정 및 액세스 정보 (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

Swati's 대답을 사용하는 것이 좋지만 텍스트 파일이 있고 복사하기 위해 코드에서 추가 라이브러리를 사용하지 않으려는 경우 다음 한 줄짜리를 사용할 수 있습니다.

with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())

모듈 shutil 보세요. 함수 copyfile ( src , dst )


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

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

import os
import shutil
import subprocess

1) shutil 모듈을 이용한 파일 복사

docs.python.org/3/library/shutil.html#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)  

2) 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')

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

shutil 당신이 사용할 수있는 많은 방법이 있습니다. 그 중 하나는 다음과 같습니다.

from shutil import copyfile

copyfile(src, dst)

src 라는 파일의 내용을 dst 라는 파일에 dst . 대상 위치는 쓰기 가능해야합니다. 그렇지 않으면 IOError 예외가 발생합니다. dst 이미 있으면 대체됩니다. 문자 또는 블록 장치 및 파이프와 같은 특수 파일은이 기능으로 복사 할 수 없습니다. srcdst 는 문자열로 주어진 경로 이름입니다.


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

여기에 표시된 대부분의 솔루션은 동적로드를 의미합니다. 나는 의존 파일을 하나의 출력 파일로 모으는 컴파일러 대신에 찾고있었습니다. Less / Sass 전 처리기와 마찬가지로 CSS @import at-rule을 처리합니다. 나는 이런 종류의 점잖은 것을 찾지 못했기 때문에이 문제를 해결하는 간단한 도구를 썼다.

따라서 $import("file-path") 를 요청 된 파일 내용으로 안전하게 대체하는 컴파일러 https://github.com/dsheiko/jsic 있습니다. 다음은 해당 Grunt 플러그인입니다. https://github.com/dsheiko/grunt-jsic .

jQuery 마스터 브랜치에서, 그들은 단순히 원시 소스 파일을 intro.js 시작하고 intro.js 로 끝나는 단일 파일로 연결합니다. 그것은 소스 코드 디자인에 유연성을 제공하지 않으므로 저에게 적합하지 않습니다. jsic과 함께 작동하는지 확인하십시오.

src / main.js

var foo = $import("./Form/Input/Tel");

src / 양식 / 입력란 / Tel.js

function() {
    return {
          prop: "",
          method: function(){}
    }
}

이제 컴파일러를 실행할 수 있습니다.

node jsic.js src/main.js build/mail.js

결합 된 파일 가져 오기

build / main.js

var foo = function() {
    return {
          prop: "",
          method: function(){}
    }
};






python file copy filesystems copyfile