繁体   English   中英

将文件移动到文件夹或进行重命名的副本(如果目标文件夹中存在)

[英]Move file to a folder or make a renamed copy if it exists in the destination folder

我有一段为学校写的代码:

import os

source = "/home/pi/lab"
dest = os.environ["HOME"]

for file in os.listdir(source):
   if file.endswith(".c")
      shutil.move(file,dest+"/c")
   elif file.endswith(".cpp")
      shutil.move(file,dest+"/cpp")
   elif file.endswith(".sh")
      shutil.move(file,dest+"/sh")

该代码的作用是在源目录中查找文件,然后如果找到某个扩展名,则将该文件移至该目录。 这部分有效。 如果该文件已存在于同名目标文件夹中,则在文件名末尾,扩展名前加上1 (如果它们是倍数),请添加“ 1 ++”。 就像这样: test1.ctest2.ctest3.c我尝试使用os.isfile(filename) ,但是这仅仅着眼于源目录。 我得到了对或错。

要测试文件是否存在于目标文件夹中,您应该使用文件名os.path.join dest文件夹

import os                                                                       
import shutil                                                                      
source = "/home/pi/lab"
dest = os.environ["HOME"]                                                                                

# Avoid using the reserved word 'file' for a variable - renamed it to 'filename' instead
for filename in os.listdir(source):                                             
    # os.path.splitext does exactly what its name suggests - split the name and extension of the file including the '.'
    name, extension = os.path.splitext(filename)                                
    if extension == ".c":                                                       
        dest_filename = os.path.join(dest, filename)                            
        if not os.path.isfile(dest_filename):                                      
            # We copy the file as is
            shutil.copy(os.path.join(source, filename) , dest)                  
        else:                       
            # We rename the file with a number in the name incrementing the number until we find one that is not used. 
            # This should be moved to a separate function to avoid code duplication when handling the different file extensions                                        
            i = 0                                                                  
            dest_filename = os.path.join(dest, "%s%d%s" % (name, i,     extension)) 
            while os.path.isfile(dest_filename):                                   
                i += 1                                                                                                                      
                dest_filename = os.path.join(dest, "%s%d%s" % (name, i, extension))
            shutil.copy(os.path.join(source, filename), dest_filename)    
    elif extension == ".cpp"
        ...
        # Handle other extensions

如果您想使用glob将重命名逻辑放在单独的函数中并re命名,这是一种方法:

import glob
import re
...
def rename_file(source_filename, source_ext):                                   
    filename_pattern = os.path.join(dest, "%s[0-9]*%s"                          
                                    % (source_filename, source_ext)) 
    # Contains file such as 'a1.c', 'a2.c', etc...
    existing_files = glob.glob(filename_pattern)
    regex = re.compile("%s([0-9]*)%s" % (source_filename, source_ext))          
    # Retrieve the max of the index used for this file using regex
    max_index = max([int(match.group(1))                                        
                     for match in map(regex.search, existing_files)
                     if match])                                                   
    source_full_path = os.path.join(source, "%s%s"                              
                                    % (source_filename, source_ext))            
    # Rebuild the destination filename with the max index + 1 
    dest_full_path = os.path.join(dest, "%s%d%s"                                
                                  % (source_filename,                           
                                     (max_index + 1),                           
                                     source_ext))                               
    shutil.copy(source_full_path, dest_full_path)

 ...
 # If the file already exists i.e. replace the while loop in the else statement
 rename_file(name, extension)

我没有测试代码。 但是像这样的事情应该可以做到:

i = 0
filename = "a.txt"
while True:
    if os.isfile(filename):
        i+= 1
    break
if i:
    fname, ext = filename.split('.')
    filename = fname + str(i) + '.' + ext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM