Как переименовать файл при копировании в другой каталог в python?

Я хотел бы скопировать файл из одного каталога в другой с одновременным переименованием файла в python. Файл необходимо скопировать как новый файл без переименования файла в исходном каталоге. Я пробовал что-то вроде этого;

     import shutil,os
     src_path="path of source directory"
     dst="path of destination directory"
     for file in os.listdir(src):
         file_path=os.path.join(src_path,file)
          shutil.copy(file_path,dst/"new"+'-'+file)

Однако это не работает. Я знаю, что с помощью модуля os.rename() его можно переименовать после копирования. Однако у меня есть файлы с похожими именами, которые будут заменять уже скопированные файлы, чтобы избежать этого, мне нужно переименовать каждый файл как новый файл вместе с самим копированием.

Любая помощь приветствуется. заранее спасибо


person Akhil    schedule 09.09.2020    source источник


Ответы (2)


Ваша попытка объединить строки с помощью dst/"new" не сработает, потому что это попытка выполнить деление. Вы правильно использовали os.path.join при создании полного пути к исходному файлу, и вам просто нужно сделать то же самое и с целевым файлом.

import shutil
import os

src_path = "path of source directory"
dst = "path of destination directory"

for file in os.listdir(src_path):
    file_path = os.path.join(src_path, file)
    shutil.copy(file_path, os.path.join(dst, "new-" + file))
person alani    schedule 09.09.2020

Каждый раз, когда вы хотите манипулировать путями в Python 3, я чувствую, что вы должны обратиться к pathlib< /а>. Вот решение, которое использует shututil copytree с настраиваемой функцией копирования. который использует pathlib. Это хорошо, потому что он также работает с вложенными каталогами — обратите внимание, что он не переименовывает каталоги, а только файлы:

from pathlib import Path
import shutil


def copy_and_rename(src: str, dst: str):
    """copy and rename a file as new-<name>"""
    new_name = "new-" + Path(dst).name
    new_dst = Path(dst).with_name(new_name)
    shutil.copy2(src, new_dst)


shutil.copytree(
    "./copy-from-me", "./copy-to-me", copy_function=copy_and_rename, dirs_exist_ok=True
)

Вот пример запуска этого:

$ tree copy-from-me
copy-from-me
├── 1.txt
├── 2.txt
└── nested
    └── 3.txt

$ tree copy-to-me
copy-to-me
├── nested
│   └── new-3.txt
├── new-1.txt
└── new-2.txt
person Ben    schedule 09.09.2020