Python操作系统-检查文件是否存在,如果存在,则重命名,再次检查,然后保存

pes8fvy9  于 2022-11-19  发布在  Python
关注(0)|答案(6)|浏览(213)

我有一个脚本,它从一个表单中获取一个文件,重命名它,并将它上载到一个文件夹,然后将记录插入到数据库中。我想添加一个功能,在保存文件之前,它会检查上载文件夹,以确定文件名是否存在。如果存在,则在循环中重命名文件,然后保存文件。
我目前拥有:

file = request.files['xx']
extension = os.path.splitext(file.filename)[1]
xx = str(uuid.uuid4()) + extension
## if xx exists .. xx = str(uuid.uuid4()) + extension.. loop endlessly.
file.save(os.path.join(app.config['UPLOAD_FOLDER'], xx)
wmomyfyw

wmomyfyw1#

还没有测试过这个,但是你可以使用os.path.isfile()来检查一个文件是否已经存在(对于目录,使用os.path.exists)。

import os

def save():
    file = request.files['xx']
    extension = os.path.splitext(file.filename)[1]

    xx = generate_filename(extension)

    file.save(os.path.join(app.config['UPLOAD_FOLDER'], xx))

def generate_filename(extension):
    xx = str(uuid.uuid4()) + extension
    if os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], xx)):
        return generate_filename(extension)
    return xx
xn1cxnb4

xn1cxnb42#

快速和肮脏的,还没有测试这个。使用检查和重命名功能递归添加“_1”,“_2”等到文件名的结尾,直到它可以保存。

def check_and_rename(file, add=0):
    original_file = file
    if add != 0:
        split = file.split(".")
        part_1 = split[0] + "_" + str(add)
        file = ".".join([part1, split[1]])
    if not os.path.isfile(file):
        # save here
    else:
        check_and_rename(original_file, add+=1)
sg3maiej

sg3maiej3#

这将检查文件是否存在,并通过增加一个数字生成一个不存在的新名称:

from os import path

def check_file(filePath):
    if path.exists(filePath):
        numb = 1
        while True:
            newPath = "{0}_{2}{1}".format(*path.splitext(filePath) + (numb,))
            if path.exists(newPath):
                numb += 1
            else:
                return newPath
    return filePath
cgvd09ve

cgvd09ve4#

你试过使用globModule,它提供了一个类似于ls的接口,你可以如下使用它:

import os
import glob
file_list = glob.glob('my_file')
if len(file_list) > 0:
   os.rename('my_file', 'new_name')
omjgkv6w

omjgkv6w5#

if not os.path.isfile(xx):
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], xx)
else:
    print("File does not exist")
0yg35tkg

0yg35tkg6#

改进了N.Walters的答案,但这样你就有了一个函数,它只解析file_path并返回一个有效的,使用内部的Path类:

import os
from pathlib import Path

def check_and_rename(file_path: Path, add: int = 0) -> Path:
    original_file_path = file_path
    if add != 0:
        file_path = file_path.with_stem(file_path.stem + "_" + str(add))
    if not os.path.isfile(file_path):
        return file_path
    else:
        return check_and_rename(original_file_path, add + 1)

相关问题