Component…
파이썬으로 어떤 방법을 이용하여 파일을 복사하고 저장하는 것이 가능할지 알아보겠습니다.
우선 저는 지금 다음과 같은 문제를 해결하려 합니다.
1. 특정 폴더 내부에 있는 어떤 파일을 새로운 경로로 복사한다.
2. 새로운 경로로 파일이 복사가 되는 것이지 이동이 되는 것이 아니다.
3. 복사된 파일의 이름을 적절한 형태로 변경할 것이다.
위 3가지 사항에 중점하여 코드를 설계했습니다.
import os
dir_path = r"your_path"
test = os.listdir(dir_path)
print(test)
먼저 내가 복사하여 저장하고 싶은 파일들이 담긴 디렉토리를 your_path 라고 가정해봅시다.
이를 os.listdir 이라는 method를 이용하여 그 내부에 있는 파일들을 리스트로 담아서 프린트를 하는 것이 가능합니다.
먼저 이걸로 정말 내가 다른 경로로 복사하기를 원하는 파일들이 제대로 된 위치에 있는지 확인을 합시다.
import shutil
# 원본 파일 경로
source = '/path/to/source/file.txt'
# 복사할 목적지 경로
destination = '/path/to/destination/file.txt'
try:
# 파일 복사
shutil.copy(source, destination)
print(f'파일이 성공적으로 {destination}에 복사되었습니다.')
except IOError as e:
print(f'파일을 복사하는 동안 오류가 발생했습니다: {e}')
except Exception as e:
print(f'예상치 못한 오류가 발생했습니다: {e}')
그렇다면 이제 이런 방법을 사용할 겁니다.
shutil 을 통해서 복사하여 특정 경로로 넣는 방법입니다.
shutil.move 라는 방법을 사용할 것이고, 이곳에는 원본 경로와 이동할 경로의 이름을 지정하여 복사가 됩니다.
요 방법을 응용하면 이제 내 디렉토리에 무더기로 담긴 파일들을 이동 시키는 것이 가능합니다.
import os
import shutil
raw_path = r"your path"
#해당 디렉토리에 있는 파일 이름들을 모두 리스트로 묶습니다.
file_names = os.listdir(raw_path)
#새롭게 복사하고 싶은 디렉토리 경로
new_path = r"your new path"
# 파일 이름들이 들은 리스트를 순회합니다.
for file in file_names:
# 파일 이름을 원래 디렉토리 경로와 결합하면 이게 원본 경로가 됩니다.
raw_file = f"{raw_path}\{file}"
# 파일 이름을 새로운 디렉토리 경로와 결합하면 이게 복사되는 목적 경로가 됩니다.
new_file = f"{new_path}\{file}"
# shutil.copy 방법으로 복사합니다.
shutil.copy(raw_file, new_file)
저는 위와 같은 방법을 이용했습니다.
이런 방법이면 특정 디렉토리 내부에 있던 모든 파일들을 새롭게 다른 경로로 복사하여 저장이 가능합니다.
그렇다면, 조금 더 복잡한 상황을 가정하여 진행하겠습니다.
이번에는 저의 경우입니다.
특정 디렉토리 경로 내부에는 수많인 디렉토리가 쌓여 있습니다.
이 개별의 디렉토리 안에는 또 다른 디렉토리가 있고, 그 디렉토리 내부에 복사하고 싶은 파일이 담겨 있습니다.
파일이 담긴 위치 구조가 복잡한 경우이죠.
또한, 이 파일의 이름도 좀 바꾸고 싶습니다.
{A}_{B}_{C} 과 같은 구조로 이뤄진 이름인데요, 여기서 저는 _로 분리해서 C 라는 값만 남겨서 새로운 이름으로 복사하고 싶습니다.
제 상황에 맞춰서 코드를 더욱 응용하겠습니다.
import os
import glob
# 최상위 디렉토리 경로
base_dir = '/path/to/base/directory'
# .dcm 파일을 찾을 패턴 설정
pattern = os.path.join(base_dir, '**', '*.dcm')
# 파일 경로를 리스트로 수집
dcm_files = glob.glob(pattern, recursive=True)
# 결과 출력
if dcm_files:
for file_path in dcm_files:
print(f'.dcm 파일 경로: {file_path}')
else:
print('해당 경로에 .dcm 파일이 없습니다.')
저는 위와 같은 glob 방법을 추가할 겁니다.
pattern 이라는 변수에 os.path.join 을 이용해서 가상의 경로를 지정합니다.
특정 디렉토리 하위로 있는 “특정한 파일들” 경로를 모두 잡아내기 위함입니다.
위 방법을 사용하면 dcm_files 라는 곳에 base_dir 아래로 있는 모든 dcm 파일들의 경로가 들어가겠네요.
import os
import shutil
import glob
raw_path = r"your path"
#해당 디렉토리 아래로 있는 모든 ".dcm" 파일들을 찾아내기 위한 경로 패턴
dcm_pattern = os.path.join(raw_path, "**" , "*.dcm")
#경로 패턴을 적용하여 파일들의 경로들을 리스트로 만든다.
dcm_files = glob.glob(dcm_pattern, recursive= True)
#새롭게 복사하고 싶은 디렉토리 경로
new_path = r"your path"
#이제 기존 파일 경로들에 있는 파일들을 새로운 디렉토리 경로로 복사할 것이다.
for file in dcm_files:
# 필요시 이쪽에서 파일의 기존 이름들을 특정한 규칙을 변경해주자
file_name = os.path.basename(file)
new_file_name = file_name.split("_")[-1]
# 새로운 디렉토리 내부로 저장할 새로운 파일의 경로
new_file = os.path.join(new_path, new_file_name)
#기존 파일을 새로운 경로로 이름을 바꾸어 복사한다.
shutil.copy(file, new_file)
자 이제 요런 방식을 이용해서 현재 파일명도 내가 원하는 규칙으로 바꿀 수도 있으며,
이후 새로운 디렉토리 내부로 현재 파일을 복사하여 넣는 코드를 완성했습니다.
이제 내가 원하는 대로 파일을 자유자재로 복사하여 특정한 위치로 붙여넣을 수 있습니다.