簡體   English   中英

移動文件並重命名(如果文件夾中存在)

[英]Move file and rename it if exist in folder

我正在嘗試移動文件夾中的文件,但如果該文件名存在於 dest 文件夾中,我想將其重命名為 ('name.py(1)') 例如。

它對前兩個文件運行良好,但在那之后它崩潰了,但我不明白為什么。

import os
import shutil
from airflow import AirflowException


uploadPath  = '/apps/manu/80_DATA/00_Loading/'
dirPath = '/apps/manu/80_DATA/04_Other/'

# print('coucou')
if(os.listdir(uploadPath)):
    for files in os.listdir(uploadPath):
        if not os.listdir(dirPath):
            shutil.move(uploadPath+files, dirPath+files)
            print('no need to rename, so i moved it ...', files)
        else:
            for files in os.listdir(uploadPath):
                addOne=0
                for dirFile in os.listdir(dirPath):
                    if files in dirFile:
                        newName = os.rename(uploadPath+files, dirPath+files+str(addOne))
                        addOne+=1
                        print('renamed in '+str(newName))
                shutil.move(uploadPath+files, dirPath+files)



else:
    print('No file')
    pass

錯誤說:

FileNotFoundError: [Errno 2] No such file or directory: '/apps/manu/80_DATA/00_Loading/coco.py' -> '/apps/manu/80_DATA/04_Other/coco.py1'

謝謝你的幫助:)

你一直在列出文件

for files in os.listdir(uploadPath):     <<===== files
        if not os.listdir(dirPath):
            shutil.move(uploadPath+files, dirPath+files)
            print('no need to rename, so i moved it ...', files)
        else:
            for files in os.listdir(uploadPath):    <<===== files again

在第二個循環中,您應該使用另一個變量名,因為它“破壞”了第一個循環。

如果目錄不相等, os.rename 會同時移動和重命名文件。 您不必先重命名文件,然后再移動它。

一些技巧:

您可以將變量名 'files' 更改為 ' file '。 這使您的代碼更加清晰,因為您從列表中一次“for file in os.listdir”迭代一個文件。

模塊 os 包含一個 os.path.exists,因此您不必自己遍歷整個目錄。

制作和使用小函數來簡化你的代碼:

# -----------------------------
def make_unique_filename(file_path):
    duplicate_nr = 0
    base, extension = os.path.splitext(file_path)
    while os.path.exists(file_path):
        duplicate_nr += 1
        file_path = f'{base}({duplicate_nr}){extension}'

    return file_path

# -----------------------------
uploadPath  = '/apps/manu/80_DATA/00_Loading/'
dirPath = '/apps/manu/80_DATA/04_Other/'

# -----------------------------
upload_files = os.listdir(uploadPath)
for upload_file in upload_files:
    upload_file_path = os.path.join(uploadPath, upload_file)
    dir_file_path = os.path.join(dirPath, upload_file)
    dir_file_path = make_unique_filename(dir_file_path)
    os.rename(upload_file_path, dir_file_path)

沒有經過測試,但我想你可以正常工作:-))

嘗試這個:

import os
import shutil
from airflow import AirflowException


uploadPath  = '/apps/manu/80_DATA/00_Loading/'
dirPath = '/apps/manu/80_DATA/04_Other/'

def unique_filename(file):
    duplicate_nr = 0
    base, extension = os.path.splitext(file)
    while os.path.exists(file):
        duplicate_nr += 1
        file = f'{base}({duplicate_nr}){extension}'
    return file

if(os.listdir(uploadPath)):
    for files in os.listdir(uploadPath):
        if not os.listdir(dirPath):
            shutil.move(uploadPath+files, dirPath+files)
            print('no need to rename, so i moved it ...', files)
        else:
            if os.listdir(dirPath):
                upload_files= os.listdir(dirPath)
                for upload_file in upload_files:
                    upload_file_path = os.path.join(uploadPath, upload_file)
                    dir_file_path = os.path.join(dirPath, upload_file)
                    dir_file_path = unique_filename(dir_file_path)
                    os.rename(upload_file_path, dir_file_path)
                    print('upld path', upload_file_path)
                    print('dir path', dir_file_path)
                    print('upld file', upload_file)
                    print('dir file', upload_files)

else:
    print('No file')
    pass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM