【问题标题】:How do I copy files in a folder directory with a specific extension and save it to a new folder with out overwriting copied files?如何复制具有特定扩展名的文件夹目录中的文件并将其保存到新文件夹而不覆盖复制的文件?
【发布时间】:2019-01-09 14:29:18
【问题描述】:

这是我正在处理的代码:

from qgis.core import*
import glob, os, shutil, time, qgis

path = r"C:\Temp\testinput"
dest = r"C:\Temp\testoutput"

fname = []
for root,d_names,f_names in os.walk(path):
    for f in f_names:
        if f.endswith('.kml'):
            src = os.path.join(root,f)
            print(time.strftime('%m/%d/%Y', time.gmtime(os.path.getmtime(src))))
            print(os.path.realpath(src))
            shutil.copy2(src, dest)

此代码横穿目录并复制文件,但会覆盖同名文件。如何防止覆盖部分?如果它在新文件夹中捕获具有相同名称的文件,我希望将相同类型的文件重命名为“文件名副本”。

【问题讨论】:

    标签: python shutil


    【解决方案1】:

    非常快速的回答;

    如果扩展名是已知的,那就没那么难了。您可以预先检查文件是否存在。通过添加这样的东西

    exists = os.path.isfile(dest)
    if exists:
        os.rename(dest , dest.replace('.kml', '-copy.kml'))
    

    所以整个事情看起来像这样:

    from qgis.core import*
    import glob, os, shutil, time, qgis
    
    path = r"C:\Temp\testinput"
    dest = r"C:\Temp\testoutput"
    
    fname = []
    for root,d_names,f_names in os.walk(path):
        for f in f_names:
            if f.endswith('.kml'):
                src = os.path.join(root,f)
                print(time.strftime('%m/%d/%Y', time.gmtime(os.path.getmtime(src))))
                print(os.path.realpath(src))
                exists = os.path.isfile(dest)
                if exists:
                    os.rename(dest , dest.replace('.kml', '-copy.kml'))
                shutil.copy2(src, dest)
    

    回答不是很快;

    但是,这假设“file-copy.kml”不存在。如果您想保留 X 份副本,也许可以以不同的方式重命名它们。 在这种情况下,我会建议这样的事情:

        exists = os.path.isfile(dest)
        if exists:
            os.rename(dest , dest.replace('.kml', '-copy_'+id_generator()+'.kml'))
    

    您将其放置在文件顶部的某个位置。

    import string
    import random
    def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
        return ''.join(random.choice(chars) for _ in range(size))
    

    我从这个问题中借用了生成一些随机字符的函数; Random string generation with upper case letters and digits in Python

    【讨论】:

    • 当我添加新代码时,我在最后一行的末尾不断收到“syntaxerror: invalid syntax”。看来它不想执行shutil.copy2。我将如何解决这个问题?在添加你推荐的代码之前没有出现这个错误
    • 抱歉,在“os.rename”语句中我忘记了一个额外的“)”。我已经更新了帖子。
    • 谢谢你,我应该意识到这一点。还有一件事。似乎带有“isfile()”的 if 语句不起作用,我读到它可能不是绝对路径。此代码应该能够扫描整个驱动器,然后将所有“.kml”粘贴到本地驱动器文件夹或桌面文件夹上的单个文件夹中。我是否必须稍微改变一下才能满足 if 语句?
    • 啊,现在我明白了……晚上在更大的显示器上。如果变量“f”是实际文件名,而“dest”只是目标文件夹......那么它应该是这个(连接文件夹和文件名),因为复制命令通常需要整个位置。 shutil.copy2(src, os.path.join(dest, f))
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2015-07-01
    • 2019-03-02
    • 2010-09-22
    • 1970-01-01
    • 2021-03-18
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多