IT이야기

Python에서 pathlib가 있는 파일 복사

cyworld 2022. 3. 26. 16:36
반응형

Python에서 pathlib가 있는 파일 복사

나는 파일을 복사하려고 한다.pathlib

import pathlib
import shutil

my_file=pathlib.Path('/etc/hosts')
to_file=pathlib.Path('/tmp/foo')
shutil.copy(my_file, to_file)

이 예외는 다음과 같다.

/home/foo_egs_d/bin/python /home/foo_egs_d/src/test-pathlib-copy.py
Traceback (most recent call last):
  File "/home/foo_egs_d/src/test-pathlib-copy.py", line 6, in <module>
    shutil.copy(my_file, to_file)
  File "/usr/lib/python2.7/shutil.py", line 117, in copy
    if os.path.isdir(dst):
  File "/home/foo_egs_d/lib/python2.7/genericpath.py", line 41, in isdir
    st = os.stat(s)
TypeError: coercing to Unicode: need string or buffer, PosixPath found

Process finished with exit code

... Python 2.7에서 pathlib로 파일을 복사하는 방법?

사용 방법:

import pathlib
import shutil

my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')

shutil.copy(str(my_file), str(to_file))  # For Python <= 3.7.
shutil.copy(my_file, to_file)  # For Python 3.8+.

는 이다.pathlib.Patha를 창조하다.PosixPath유닉스/리눅스를 사용하는 경우WindowsPathMicrosoft Windows(윈도우)를 사용하는 경우

파이썬의 eye전o는shutil.copy인수로 문자열을 필요로 한다.그들을 위해,str여기서 기능하다

님의 인기에 .shutil.copy()하지 않는 동동물은 파이썬, 파이썬 3.6 을 것이다.shutil.copy() 감당할 수 있다Path물체(또는 그 하위 분류)이전 버전의 Python에서 오류가 발생하는 이유는shutil문자열 인수를 기대copy, 그리고 그렇지 않다.pathlib.Path타이프식 논쟁

실제로 쓰기를 원하는 것은 다음과 같다.

my_file.copy(to_file)

하위 클래스 Path를 사용하여 이러한 메서드를 포함시키고my_file. 기존 제품에 접목/원키패치/덕퍼치하는 것이 더 쉽다는 것을 알게 되었다.pathlib.Path

from pathlib import Path


def _copy(self, target):
    import shutil
    assert self.is_file()
    shutil.copy(str(self), str(target))  # str() only there for Python < (3, 6)

Path.copy = _copy

이 코드를 호출하기 전에 실행하기만 하면 어디든 이 코드를 넣을 수 있다..copy 관한 어느 한 방법.Path예시에 대한 주장..copy()파일이나 디렉토리가 될 수 있다.

3.부터 Python 3.5를 가성기(가성기)shutil, 수행할 수 있는 작업:

from pathlib import Path

dest = Path('dest')
src = Path('src')
dest.write_bytes(src.read_bytes()) #for binary files
dest.write_text(src.read_text()) #for text files

Python 2.7에 대해, 는read_bytesread_textwrite_bytes그리고write_text방법들

파일은 메모리에 로드되므로 이 방법은 컴퓨터 사용 가능한 메모리보다 큰 파일에는 적합하지 않다.

코멘트에 따르면 다음과 같이 사용할 수 있다.write_bytes그리고read_bytes텍스트 파일을 복사하지만 복사 시 인코딩을 처리해야 하는 경우write_texta의read_text다음과 같은 두 가지 추가 매개변수의 장점을 제시한다.

  • encoding파일을 디코딩하거나 인코딩하는 데 사용되는 인코딩의 이름
  • errors인코딩 및 디코딩 오류를 처리하는 방법을 지정하는 선택적 문자열

그들 둘은 모두 의와 같은 뜻을 같이하다

어떻게shutil수긍하도록 개종되었다.pathlib.PathPython 3.6의 객체

이 답변에서 언급한 바와 같이 Python 3.6의 Shutil은pathlib.Path물건들

이것이 꽤 마법을 느꼈기 때문에, 나는 이 마법을 내 수업 시간에 재사용할 수 있을지 알아보기 위해 어떻게 구현되었는지에 대해 조금 더 조사해 보기로 했다.

그 개선은 PEP 519의 결과였다.

이는 많은 stdlib 기능을 일반화하였으며, 문서화는 대부분의 기능을 포함하여 결과적으로 일관성 있게 업데이트되지 않았다.shutil3.7년 현재 단일 함수로만 지원되는 문서.역동적인 타이핑의 즐거움을 환영한다.

문서화된 경우 stlib는 "경로 유사 객체"대한 용어집에 연결된다.

파일 시스템 경로를 나타내는 개체.경로와 유사한 객체는 경로를 나타내는 스트리트 또는 바이트 객체 또는 OS를 구현하는 객체 중 하나이다.PathLike 프로토콜.OS를 지원하는 개체.pathLike 프로토콜은 os.fspath() 함수를 호출하여 str 또는 바이트 파일 시스템 경로로 변환할 수 있으며, os.fsdecode() 및 os.fsencode()를 사용하여 str 또는 바이트 결과를 각각 보장할 수 있다.PEP 519에 의해 소개됨.

그리고 다음 링크를 다음 문서에 연결하십시오.

파일 시스템 경로를 나타내는 개체의 추상 기본 클래스(예: pathlib)퓨어패스.

버전 3.6의 새로운 기능.

abstractmethod __fspath__()

개체의 파일 시스템 경로 표현을 반환하십시오.

메소드는 str 또는 바이트 객체만 반환해야 하며, 기본 설정은 str에 대한 것이다.

주요 이행 약속은 다음과 같다.

자신의 경로와 같은 클래스를 구현하려면 다음과 같이 하십시오.

#!/usr/bin/env python3

class MyPath:
    def __init__(self, path):
        self.path = path
    def __fspath__(self):
        return self.path

with open(MyPath('f'), 'w'):
    pass

Python 3.6.7, Ubuntu 18.10에서 시험했다.

pathlib3x를 사용할 수 있음 - Python 3.6 이상용 최신(Python 3.10.a0) Python pathlib의 백포트와 다음과 같은 몇 가지 추가 기능을 제공한다.copy,copy2, 등등...

$> python -m pip install pathlib3x
$> python
>>> import pathlib3x as pathlib
>>> my_file = pathlib.Path('/etc/hosts')
>>> to_file = pathlib.Path('/tmp/foo')
>>> my_file.copy(to_file)

당신은 그것을 GithubPyPi에서 찾을 수 있다.


고지 사항:나는 pathlib3x 라이브러리의 작가다.

다음 대신 이름 바꾸기 방법을 사용할 수 있다.shutil.move().

import pathlib

my_file = pathlib.Path('/etc/hosts')
to_file = pathlib.Path('/tmp/foo')
my_file.rename(to_file)

참조URL: https://stackoverflow.com/questions/33625931/copy-file-with-pathlib-in-python

반응형