2015-03-10 2 views
0

У меня есть кусок кода, я написал для школы:Переместить файл в папку или сделать переименованную копию, если она существует в папке назначения

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 ++». Нравится 0: test1.c, test2.c, test3.c Я пробовал использовать os.isfile(filename), но это касается только исходного каталога. и я получаю истинное или ложное.

ответ

0

Чтобы проверить, существует ли файл в папке назначения следует 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) 
0

Я не тестирую код. Но что-то вроде этого должно делать эту работу: -

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 
Смежные вопросы