3

我正在尝试移动文件夹中的文件,但如果此文件名存在于 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'

谢谢帮助:)

4

2 回答 2

2

你不断列出文件

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 同时移动和重命名文件。您不必先重命名文件,然后再移动它。

一些技巧:

您可以将变量名称“文件”更改为“文件”。这使您的代码更加清晰,因为您从列表中一次迭代一个文件“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)

未经测试,但我猜你让它工作:-))

于 2020-03-06T15:15:22.203 回答
0

尝试这个:

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
于 2020-03-06T16:43:38.473 回答