【问题标题】:Copy all files within directory into new directory while renaming files with same name in Python将目录中的所有文件复制到新目录中,同时在 Python 中重命名具有相同名称的文件
【发布时间】:2020-12-23 02:15:18
【问题描述】:

我正在尝试将源目录中的每个 csv 文件及其子文件夹复制到一个新的“mega”文件夹中。最终结果将是一个文件夹,其中除了在源目录中找到的 csv 文件之外什么都没有。

我面临的问题是某些 csv 文件名是相同的。因此,在复制文件时,将覆盖具有相同名称的文件。我希望能够重命名它们,而不是覆盖它们。我想重命名文件的格式示例是:

  • abcd
  • abcd_1
  • abcd_2 等...

我找到了this thread,但答案对我不起作用。

我的代码如下(基于提供的链接):

movdir = r"Source Directory"
basedir = r"Destination Folder"
# Walk through all files in the directory that contains the files to copy
for root, dirs, files in os.walk(movdir):
    for filename in files:
        # I use absolute path, case you want to move several dirs.
        old_name = os.path.join(os.path.abspath(root), filename)

        # Separate base from extension
        base, extension = os.path.splitext(filename)

        # Initial new name
        new_name = os.path.join(basedir, base, filename)

        # If folder basedir/base does not exist... You don't want to create it?
        if not os.path.exists(os.path.join(basedir, base)):
            print(os.path.join(basedir,base), "not found") 
            continue    # Next filename
        elif not os.path.exists(new_name):  # folder exists, file does not
            shutil.copy(old_name, new_name)
        else:  # folder exists, file exists as well
            ii = 1
            while True:
                new_name = os.path.join(basedir,base, base + "_" + str(ii) + extension)
                if not os.path.exists(new_name):
                   shutil.copy(old_name, new_name)
                   print("Copied", old_name, "as", new_name)
                   break 
                ii += 1

当我运行这段代码时,它只是打印出源目录中的每个 csv 文件都“未找到”,并且根本没有复制任何文件。

我们将不胜感激任何有关这方面的帮助或信息。

【问题讨论】:

  • 好吧,打印“... not found”后,你的下一行代码是continue。你觉得continue 之后会发生什么?

标签: python csv directory copy


【解决方案1】:

尝试以下修改:

movedir = r"source"
basedir = r"destination"
# Walk through all files in the directory that contains the files to copy
for root, dirs, files in os.walk(movdir):
    for filename in files:
        # I use absolute path, case you want to move several dirs.
        old_name = os.path.join(os.path.abspath(root), filename)

        file_path,file_bare_name = os.path.split(filename) # this is were ur code didn't work as u use base as the bare file name and the relative path to source ambiguously.
        base, extension = os.path.splitext(file_bare_name)
        file_relative_path_to_source = root[len(movedir)+1:] #removing the old dir name from the relative path 
        
        if extension=='.csv': # taking only csv files
            # Initial new name
            new_name = os.path.join(basedir, file_bare_name)
            if not os.path.exists(new_name):  # file dosn't exist
                shutil.copy(old_name, new_name)
            else:  # copies being renamed
                ii = 1
                while True:
                    new_name = os.path.join(basedir, file_bare_name + "_" + str(ii) + extension)
                    if not os.path.exists(new_name):
                        shutil.copy(old_name, new_name)
                        print("Copied", old_name, "as", new_name)
                        break 
                    ii += 1

【讨论】:

    猜你喜欢
    • 2020-10-20
    • 2019-03-15
    • 2012-09-29
    • 2018-03-13
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多