Автоматически получать дату создания и переименовывать в нее файл - PullRequest
2 голосов
/ 05 августа 2020

Мне было интересно, есть ли способ автоматически получить дату создания и переименовать файл в нее. Я немного кодировал в нем, но потом получил ошибку. В сообщении об ошибке говорилось, что FileNotFoundError: [WinError 2] Система не может найти указанный файл: «AutoDateRename». Где AutoDateRename - это имя папки, в которую я хочу переименовывать файлы в go. Есть ли способ сделать это? Полная ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\lucio\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "c:/Users/lucio/Documents/PythonWorkspace/FileAutoDateRename/script.py", line 21, in RenameDateCreated
    os.rename(rf'{E1_Val.get()}/{filename}',rf'{E1_Val.get()}/AutoDateRename/{time.ctime(os.path.getctime(filename))}')
  File "C:\Users\lucio\AppData\Local\Programs\Python\Python38-32\lib\genericpath.py", line 65, in getctime
    return os.stat(filename).st_ctime
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'AutoDateRename'

Мой код:

from tkinter import *
from tkinter import filedialog
import os.path, time
import os

window = Tk()
window.title("File Auto Date Rename")
window.geometry("500x300")
window.resizable(width=False,height=False)

E1_Val = StringVar()

def SelectFolder():
    window.filename = filedialog.askdirectory()
    E1.delete(0,"end")
    E1.insert(END,window.filename)

def RenameDateCreated():
    os.mkdir(f'{E1_Val.get()}/AutoDateRename')
    for filename in os.listdir(E1_Val.get()):
        os.rename(rf'{E1_Val.get()}/{filename}',rf'{E1_Val.get()}/AutoDateRename/{time.ctime(os.path.getctime(filename))}')

L1 = Label(text="Auto Date Rename",font='Helvetica 16 bold underline')
L1.pack()

L2 = Label(text="Folder Path",font='Helvetica 12 bold italic')
L2.pack(pady=5)

E1 = Entry(window,textvariable=E1_Val)
E1.pack(pady=5)

B1 = Button(window,text="Locate",height=1,width=5,command=SelectFolder)
B1.pack(pady=5)

L4 = Label(text="Rename Options",font='Helvetica 12 bold italic')
L4.pack(pady=5)

B2 = Button(window,text="Rename Using Date Created",height=1,width=25,command=RenameDateCreated)
B2.pack(pady=2)

B3 = Button(window,text="Rename Using Date Modified",height=1,width=25)
B3.pack(pady=2)

L5 = Label(text="Make sure that the folder you\nare converting is backed up in a safe location!",font='Helvetica 14 bold')
L5.pack(pady=15)

window.mainloop()

1 Ответ

1 голос
/ 06 августа 2020

Поскольку вы создали каталог AutoDateRename внутри исходного каталога (возвращаемый E1_Val.get(), он будет включен в список, возвращаемый os.listdir(), и я думаю, вы не хотите его переименовывать. Поэтому вам следует проверить является ли исходный файл файлом, а не каталогом.

И os.path.getctime(filename) должно быть os.path.getctime(os.path.join(E1_Val.get(), filename)).

Также time.ctime() может возвращать строку с символами (например, :) которые недопустимы в имени файла. Используйте time.strftime(), чтобы отформатировать время, чтобы оно было допустимым именем файла.

Ниже приведено обновленное RenameDateCreated():

def RenameDateCreated():
    srcdir = E1_Val.get().strip()
    if srcdir:
        destdir = os.path.join(srcdir, 'AutoDateRename') 
        os.makedirs(destdir, exist_ok=True) # create the directory if it does not exists
        for filename in os.listdir(srcdir):
            srcpath = os.path.join(srcdir, filename)
            if os.path.isfile(srcpath): # only process file, not directory
                ctime = time.strftime('%Y%m%d_%H%M%S', time.localtime(os.path.getctime(srcpath)))
                destpath = os.path.join(destdir, f'{ctime}_{filename}')
                os.rename(srcpath, destpath)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...