os.rename()创建新文件,而不是重命名文件

时间:2019-08-15 13:02:18

标签: python python-3.x windows tkinter windows-10

因此,我将tkinter与python 3和Windows 10(64位)一起使用。我有一个保存功能,可以将几个输入框中的内容保存为.txt文件。然后,用户可以从应用程序中打开.txt文件,所有数据将返回其原始位置。作为程序的一部分,标签会显示当前打开的文件的文件名。用户可以在窗口中编辑文件名。

当用户保存时,我想将文件的文件名更改为用户在窗口中写入的文件名。这在大多数情况下都有效。但是,如果用户在输入框中写了任何东西,并且在我的应用程序中更改了文件名,那么在保存时,不仅会更改实际的文件名。

相反,它只是使用新文件名创建一个新文件。它还会吐出错误:

FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:/Users/User/Documents/Python stuff/Other apps/Veteris/Scripts/test.txt' -> 'test2.txt'

我正在使用os.rename()函数。另外,当用户打开文件时,我无法显示文件名。任何帮助,也将不胜感激。这是我的代码:

def _open():
    global file_dir

    file_dir = tkfd.askopenfilename(title = "Open...", defaultextension = 
                   '.txt', filetypes = (('Text files', '*.txt'), ('Excel 
                    Workbook', '*.xlsx')))

    if file_dir.endswith('.txt'):
        with open(file_dir, 'r') as input_file:
                    # saves stuff

    elif file_dir.endswith('.xlsx'):
           # saves stuff

    new_file_name = os.path.basename(file_dir.name).strip('.txt.xlsx')

    file_title.config(text = new_file_name)

def save_as():
    global filepath
    global file_dir
    global file_name
    global save_status


    file_dir = tkfd.asksaveasfilename(initialfile = file_name, initialdir 
                 = filepath, title = "Save as", defaultextension = '.txt', 
                 filetypes = [('Text files', '*.txt')]) # Sets file_dir to the 
                  directory the user creates (in save as dialog)

    try:
        with open(file_dir, 'w') as output_file:
                # saves the stuff


        time_saved_label.config(text = "Saved")
        save_status = True

    except:
        print("'Save as' cancelled")

def save():
    global file_dir
    global file_name
    global save_status

    notepad_save = notepad.get('1.0', END).strip('\n')

    eyes_save = eyes_entry.get().strip('\n') + '\n'
    if file_dir is None:
        return save_as()

    else: 
        with open(file_dir, 'w') as output_file:


            output_file.write(notepad_save)

        new_file_name = file_name + '.txt'
        os.rename(file_dir, new_file_name)

就像我说的那样,代码应该更改文件名,就是这样(以及更新内容)。

相反,它只是创建具有最新更改的副本。

1 个答案:

答案 0 :(得分:2)

我认为带有os.rename的行应为:

os.rename(file_dir + file_name, file_dir + new_file_name)