프로젝트에서 Python의 os 모듈에서 제공하는 함수를 여러 번 사용해 보셨을 것입니다. 이는 파일 생성, 디렉터리 탐색, 현재 디렉터리 정보 가져오기, 경로 작업 수행 등을 수행하는 데 사용될 수 있습니다.
이 글에서는 os 모듈의 다른 기능만큼 유용하지만 거의 사용되지 않는 기능에 대해 논의하겠습니다.
공통 디렉터리 구조를 공유하는 여러 파일로 작업할 때 가장 긴 공유 경로를 찾고 싶을 수도 있습니다. os.path.commonpath()가 바로 그런 일을 합니다. 이는 파일을 정리하거나 환경 전반에 걸쳐 다양한 경로를 처리할 때 도움이 될 수 있습니다.
예:
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
이 코드는 이 두 경로가 공유하는 공통 경로를 제공합니다.
Common Path: /user/data
os.path.commonpath()가 경로 이름 목록을 가져오는 것을 볼 수 있는데, 이는 수동으로 기록해 두는 것이 비현실적일 수 있습니다.
이 경우 모든 디렉터리, 하위 디렉터리 및 파일 이름을 반복한 다음 공통 경로를 찾는 것이 가장 좋습니다.
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
이 예에서 get_file_paths() 함수는 디렉터리를 위에서 아래로 탐색하고 file_paths 목록에 있는 모든 경로를 추가합니다. 이 함수는 특정 파일을 찾으려는 경우 선택적으로 파일 확장자를 사용합니다.
이제 모든 디렉토리의 공통 경로를 쉽게 찾을 수 있습니다.
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
os.listdir()을 사용하여 디렉토리의 내용을 가져오는 경우 대신 os.scandir() 사용을 고려해 보세요. 속도가 더 빠를 뿐만 아니라 파일 유형, 권한, 항목이 파일인지 디렉터리인지와 같은 유용한 정보를 제공하는 DirEntry 개체도 반환합니다.
예:
import os with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries: for entry in entries: print(f"{entry.name} : \n" f">>>> Is File: {entry.is_file()} \n" f">>>> Is Directory: {entry.is_dir()}")
이 예에서는 os.scandir()을 사용하여 디렉터리를 전달한 다음 이 디렉터리를 반복하여 정보를 인쇄했습니다.
.idea : >>>> Is File: False >>>> Is Directory: True main.py : >>>> Is File: True >>>> Is Directory: False sample.py : >>>> Is File: True >>>> Is Directory: False
파일 작업 중 확장자를 확인해야 한다고 가정해 보겠습니다. os.path.splitext() 함수에서 도움을 받을 수 있습니다. 파일 경로를 루트와 확장자로 분할하여 파일 형식을 결정하는 데 도움이 됩니다.
import os filename = 'report.csv' root, ext = os.path.splitext(filename) print(f"Root: {root} \n" f"Extension: {ext}")
출력
Root: report Extension: .csv
경로가 이상할 수 있는 경우에 대해 os.path.splitext()가 어떻게 작동하는지 살펴보세요.
import os filename = ['.report', 'report', 'report.case.txt', 'report.csv.zip'] for idx, paths in enumerate(filename): root, ext = os.path.splitext(paths) print(f"{idx} - {paths}\n" f"Root: {root} | Extension: {ext}")
출력
0 - .report Root: .report | Extension: 1 - report Root: report | Extension: 2 - report.case.txt Root: report.case | Extension: .txt 3 - report.csv.zip Root: report.csv | Extension: .zip
디렉토리를 생성하는 데 자주 사용되는 기능이 이미 있습니다. 하지만 중첩된 디렉터리를 생성하면 어떨까요?
os.mkdir()은 한 번에 하나의 디렉토리만 만들기 때문에 중첩된 디렉토리를 생성하는 것은 번거로울 수 있습니다. os.makedirs()를 사용하면 한 번에 여러 개의 중첩 디렉터리를 생성할 수 있으며,exist_ok=True 인수를 사용하면 디렉터리가 이미 존재하는 경우 오류가 발생하지 않습니다.
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
이 프로그램을 실행하면 지정된 디렉터리와 하위 디렉터리가 생성됩니다.
Common Path: /user/data
위 프로그램을 다시 실행하면existent_ok=True이므로 오류가 발생하지 않습니다.
os.rename()과 유사하게 os.replace()는 파일을 새 위치로 이동하지만 대상에 있는 기존 파일을 안전하게 덮어씁니다. 이는 파일을 업데이트하거나 백업하고 오래된 파일을 안전하게 교체하려는 작업에 유용합니다.
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
이 코드에서 main.py 파일은 os.rename() 함수와 마찬가지로 new_main.py로 이름이 바뀌지만 이 작업은 전부 가져오거나 아예 가져가지 않는 것과 같습니다. 이는 파일 교체가 분할할 수 없는 단일 단계에서 발생하므로 전체 작업이 성공하거나 전혀 변경되지 않음을 의미합니다.
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
암호화를 위해서는 안전한 무작위 데이터 소스가 필요합니다. os.urandom()은 임의의 ID, 토큰 또는 비밀번호 생성과 같은 작업에 적합한 임의 바이트를 생성합니다. 민감한 데이터에는 랜덤 모듈보다 더 안전합니다.
os.urandom()은 다양한 리소스에서 사용 중인 운영 체제에 의해 생성된 무작위성을 사용하여 바이트(데이터)를 예측할 수 없게 만듭니다.
Windows에서는 BCryptGenRandom()을 사용하여 임의 바이트를 생성합니다.
import os with os.scandir('D:/SACHIN/Pycharm/osfunctions') as entries: for entry in entries: print(f"{entry.name} : \n" f">>>> Is File: {entry.is_file()} \n" f">>>> Is Directory: {entry.is_dir()}")
출력
.idea : >>>> Is File: False >>>> Is Directory: True main.py : >>>> Is File: True >>>> Is Directory: False sample.py : >>>> Is File: True >>>> Is Directory: False
Python의 os.path.samefile() 함수는 두 경로가 파일 시스템의 동일 파일 또는 디렉터리를 참조하는지 확인하는 데 사용됩니다. 이는 기호 링크, 하드 링크 또는 동일한 위치에 대한 서로 다른 절대 및 상대 경로를 처리할 때와 같이 여러 경로가 동일한 실제 파일을 가리킬 수 있는 시나리오에서 특히 유용합니다.
import os filename = 'report.csv' root, ext = os.path.splitext(filename) print(f"Root: {root} \n" f"Extension: {ext}")
os.path.samefile()은 두 경로가 모두 디스크의 동일한 파일(예: 파일 시스템의 동일한 데이터에 하드 링크되거나 심볼릭 링크된 파일)을 참조하는 경우에만 True를 반환하도록 설계되었습니다.
os.path.relpath()는 두 경로 사이의 상대 경로를 계산하는 계산 함수입니다. 이는 파일 경로를 동적으로 구축하거나 상대 가져오기 작업을 할 때 특히 유용합니다.
다음 예를 고려해보세요.
Root: report Extension: .csv
이 예에는 탐색해야 하는 경로가 포함된 target_path가 있고 target_path에 대한 상대 경로 계산을 시작해야 하는 경로가 start_path에 포함되어 있습니다.
이것을 실행하면 다음과 같은 결과가 나옵니다.
import os paths = ['/user/data/project1/file1.txt', '/user/data/project2/file2.txt'] common_path = os.path.commonpath(paths) print("Common Path:", common_path)
이는 세 개의 디렉터리로 이동한 다음,engine/log.py로 내려와야 함을 의미합니다.
파일 쓰기(file.write()) 작업을 수행하면 데이터가 즉시 디스크에 저장되지 않고 시스템 버퍼에 데이터가 저장되며, 디스크에 데이터를 쓰기 전에 예상치 못한 일이 발생하면 데이터가 손실됩니다.
os.fsync()는 데이터 무결성을 보장하기 위해 데이터를 강제로 기록합니다. 특히 로깅이나 손실되어서는 안 되는 중요한 데이터를 작성할 때 유용합니다.
Common Path: /user/data
os.fsync(f.fileno())는 데이터가 버퍼에 남지 않고 디스크에 즉시 기록되는지 확인하기 위해 호출됩니다.
os.fsync()는 파일 설명자를 사용하므로 시스템에서 작업 중인 파일에 할당한 고유 정수인 f.fileno()를 전달했습니다.
CLI 도구를 생성하는 경우 터미널 너비에 맞게 출력 형식을 지정하면 출력이 더 깔끔해질 수 있습니다. os.get_terminal_size()는 현재 터미널 너비와 높이를 제공하므로 콘텐츠 형식을 동적으로 쉽게 지정할 수 있습니다.
import os def get_file_paths(directory, file_extension=None): # Collect all file paths in the directory (and subdirectories, if any) file_paths = [] for root, dirs, files in os.walk(directory): for file in files: if file_extension is None or file.endswith(file_extension): file_paths.append(os.path.join(root, file)) return file_paths # Specify the root directory to start from directory_path = 'D:/SACHIN/Pycharm/Flask-Tutorial' # If you want to filter by file extension file_paths = get_file_paths(directory_path, file_extension='.html') # Find the common path among all files if file_paths: common_path = os.path.commonpath(file_paths) print("Common Path:", common_path) else: print("No files found in the specified directory.")
이 코드를 터미널에서 실행하면 이 스크립트를 실행 중인 터미널의 크기를 알 수 있습니다.
Common Path: D:\SACHIN\Pycharm\Flask-Tutorial\templates
참고: 프로그램이 터미널에 액세스할 수 없는 IDE에서 스크립트를 직접 실행하면 오류가 발생할 수 있습니다.
?이 기사가 마음에 든다면 관심을 가질 만한 다른 기사
✅FastAPI의 프런트엔드에서 동영상 스트리밍.
✅Python에서 순환 가져오기를 수정하는 방법.
✅Flask의 템플릿 상속
✅Python에서 유형 힌트를 사용하는 방법은 무엇입니까?
✅Pandas의 데이터 세트에서 일치하지 않는 열을 찾고 삭제하는 방법은 무엇입니까?
✅학습률은 ML 및 DL 모델에 어떤 영향을 미치나요?
지금은 이게 다입니다.
계속 코딩하세요✌✌.
위 내용은 유용하지만 거의 사용되지 않는 Python의 OS 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!