复制并重命名为新文件夹

时间:2017-08-18 20:28:40

标签: python

我写了一些简单易用的代码来重命名很多文件。 源文件夹是路径(文件位于主文件夹和许多子文件夹中。 目标文件夹是newPath(这里我想将所有重命名的文件组合在一起。

代码有效,但我想更改/更新它。

我现在不知道如何在shutil.copy中包含文件夹名称

"changed" + str(count) + ".csv"

如何获取文件所在的文件夹名称,包含在复制的名称中?

import os
import shutil

def main():
    path = "C:/code/convert/renamefiles/source"
    newPath = "C:/code/convert/renamefiles/target"
    count = 1

    for root, dirs, files in os.walk(path):
        for i in files:
            if i.endswith('lb_panorama.csv'):
                shutil.copy(os.path.join(root, i), os.path.join(newPath, "changed" + str(count) + ".csv"))
                print i
                count += 1

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:2)

我使用pathlib遍历目录,因为它比你使用的方法简单得多。我不检查源路径和目标路径是否存在,因此如果不存在则会抛出异常。复制文件时,会将它们重命名为源父文件夹的名称,该名称将使用pathlib.Path.parent.name进行检索。

代码的最高位是记录器。它记录到名为CopyErrors.log的文件,并在与Python脚本相同的目录中创建。要记录错误,我只会捕获shutil.copy抛出的任何异常。

import pathlib
import shutil
import logging

def main(src, dest):
    logger = logging.getLogger("CopyFiles")
    logger.setLevel(logging.WARNING)
    handler = logging.FileHandler(filename = "CopyErrors.log",
                                  encoding = "utf-8",
                                  mode = "w")
    handler.setFormatter(logging.Formatter(
        "%(asctime)s - [%(levelname)s] %(name)s: %(message)s"))
    logger.addHandler(handler)

    pathSrc = pathlib.Path(src).glob("**/*.csv")

    for file in pathSrc:
        try:
            shutil.copy(str(file), f"{dest}/{file.parent.name}.csv")
        except Exception as e:
            logger.warning(f"{file} could not be copied.\n"
                           f"{type(e).__name__}: {e}")

if __name__ == '__main__':
    main("Z:/Geoportal/MoMa/MoMa1", "Z:/Geoportal/MoMa/Moma1_new")