IT이야기

Os.Rename에서 강제 덮어 쓰기

cyworld 2021. 4. 30. 21:45
반응형

Os.Rename에서 강제 덮어 쓰기


이미 존재하는 경우 다른 파일을 덮어 쓰도록 os.rename 이름 바꾸기를 강제 할 수 있습니까? 예를 들어 아래 코드에서 Tests.csv 파일이 이미 존재하는 경우 Tests.txt 파일로 대체됩니다 (또한 Tests.csv로 이름이 변경됨).

os.rename("C:\Users\Test.txt","C:\Users\Tests.csv");

시도해 볼 수 있습니다 shutil.move().

from shutil import move

move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')

또는 os.remove다음 shutil.move:

from os import remove
from shutil import move

remove('C:\\Users\\Tests.csv')
move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')

Python 3.3부터 이제 표준 크로스 플랫폼 솔루션이 있습니다 os.replace.

파일 또는 디렉토리 src의 이름을 dst로 바꿉니다. dst가 디렉토리이면 OSError발생합니다. dst가 존재하고 파일 인 경우 사용자에게 권한이 있으면 자동으로 대체됩니다 . src와 dst가 다른 파일 시스템에 있으면 작업이 실패 할 수 있습니다. 성공하면 이름 변경은 원자 적 작업이됩니다 (POSIX 요구 사항).

가용성 : Unix, Windows.

버전 3.3의 새로운 기능.

그러나 문서와 달리 Windows에서는 원 자성이 보장되지 않습니다 (Python 3.4.4). 내부적MoveFileEx 으로 Windows에서 사용 하기 때문에 그런 보장을하지 않습니다.


는 AS 설명서를 말한다는 파일이 두 단계를 수행하기 위해 요구하고 그래서 파이썬 않는 존재하는 경우 Windows에서 원자 이름 바꾸기 작업을 보장하는 것은 불가능 os.remove+ os.rename잠재적 인 오류를 처리하는 자신.

유닉스 시스템 rename에서는 대상이있는 경우이를 덮어 씁니다 (작업이 원 자성이 보장되기 때문에).

Windows에서는 파일이 사용 중일 수 있으므로 권한이 있어도 대상 파일을 삭제하지 못할 수도 있습니다. 이것은 Windows 파일 시스템의 또 다른 필수 제한 사항이며 코드에서 직접 처리해야합니다.


Unix에서 dst가 존재하고 파일이면 사용자에게 권한이 있으면 자동으로 대체됩니다. src 및 dst가 다른 파일 시스템에있는 경우 일부 Unix 버전에서 작업이 실패 할 수 있습니다. 성공하면 이름 변경은 원자 적 작업이됩니다 (POSIX 요구 사항). Windows에서 dst가 이미 존재하면 파일이더라도 OSError가 발생합니다. dst가 기존 파일의 이름을 지정할 때 원자 적 이름 변경을 구현할 방법이 없을 수 있습니다 . http://docs.python.org/library/os.html#os.rename


재미있게도에 대한 문서 os.rename()는 Unix 시스템에서 대상을 대체한다고 말하지만 Windows에서는 그렇지 않습니다. 그들은 대상이 Windows에 존재하는 경우 원자 이름 변경을 구현하는 것이 불가능하다는 모호한 점을 언급합니다. IMO는이를 지원하지 않을 충분한 이유가 없습니다.

OSError (대상이 Windows에 있음)를 포착하고 대상을 제거하고 다시 시도해야합니다.


표준 라이브러리 문서에서“Windows에서 dst가 이미 존재하면 파일이더라도 OSError가 발생합니다. dst가 기존 파일의 이름을 지정할 때 원자 이름 변경을 구현할 방법이 없을 수도 있습니다.”

http://docs.python.org/library/os.html#os.rename

유감스럽게도 유일한 해결책은 운영 체제를 변경하는 것입니다. Windows는 단순히 rename()기존 파일 위에있는 것을 허용하지 않습니다 .

참조 URL : https://stackoverflow.com/questions/8107352/force-overwrite-in-os-rename

반응형