python os 模块不会重命名文件,即使文件存在 - os.rename(src, dst)

问题描述 投票:0回答:1

我正在尝试重命名目录中的文件。但由于某种我不知道的原因,这些文件没有被重命名。

代码:


def extract_info_from_filename(file_name):
    parts = file_name.split('Z')
    part1 = parts[0]
    part2 = parts[1]
    
    return part1, part2

def find_csv_files_to_rename(directory):
    for root, dirs, files in os.walk(directory):
        if 'rename' in root:
            for file_name in files:
                if file_name.endswith('.csv'):
                    original_file_path = root + '/' + file_name
                    print(f"File Name: {file_name}, Extracted Info: {extract_info_from_filename(file_name)}")
                    extracted_parts = extract_info_from_filename(file_name)
                    new_file_name = f"{extracted_parts[0]}Z_treatment{extracted_parts[1]}"
                    print(f"New File name: {new_file_name}")
                    #new_file_path = os.path.join(root,new_file_name)
                    new_file_path =root+'/'+new_file_name
                    print(f"New File Path Exists: {os.path.exists(new_file_path)}")
                    print(f"Original File Path Exists: {os.path.exists(original_file_path)}")
                    print(f"Root: {root}")
                    print(f"New file path: {new_file_path}")
                    if not os.path.exists(new_file_path):        
                        os.rename(original_file_path, new_file_path)
                        if os.rename(original_file_path, new_file_path):
                            print(f'Renamed: {file_name} -> {new_file_name} \n')
                    else:
                        print(f'File already exists: {original_file_path} \n')


root_directory = 'input_files'
find_csv_files_to_rename(root_directory)

输出是:

File Name: 2023-07-08T00_28_04_750Z_Aachen_01.01.2022-P06.2023.csv, Extracted Info: ('2023-07-08T00_28_04_750', '_Aachen_01.01.2022-P06.2023.csv')
New File name: 2023-07-08T00_28_04_750Z_treatment_Aachen_01.01.2022-P06.2023.csv
New File Path Exists: False
Original File Path Exists: False
Root: input_files\rename_and_validate\XXXX\year=2023\month=07\day=08\XXXX
New file path: input_files\rename_and_validate\XXXX\year=2023\month=07\day=08\XXXX/2023-07-08T00_28_04_750Z_treatment_Aachen_01.01.2022-P06.2023.csv

错误:

FileNotFoundError: [WinError 3] The system cannot find the path specified: 'input_files\\rename_and_validate\\XXXX\\year=2023\\month=07\\day=08\\XXXX/2023-07-08T00_28_04_750Z_Aachen_01.01.2022-P06.2023.csv' -> 'input_files\\rename_and_validate\\XXXX\\year=2023\\month=07\\day=08\\XXXX/2023-07-08T00_28_04_750Z_treatment_Aachen_01.01.2022-P06.2023.csv'

我想知道解决方案。我已经尝试了所有可能的方法来解决该问题,从修改路径(使用 .join 函数)。但似乎是同一个问题。

python file-handling filenotfoundexception python-os
1个回答
0
投票

您遇到的问题源于您格式化文件路径的方式。您当前正在使用字符串连接,如下所示:

original_file_path = root + '/' + file_name
。虽然此方法在类 Unix 系统上运行良好,但在 Windows 上可能会导致问题,因为 Windows 使用反斜杠 (
\\
) 而不是正斜杠 (
/
) 作为文件路径。这种差异在您共享的输出中很明显。

要编写独立于平台的代码,您可以使用 Python 标准库中的

os.path.join()
函数。此函数会为您处理斜杠并确保您的代码可以在不同的操作系统上运行。

以下是修改代码的方法:

import os

def extract_info_from_filename(file_name):
    parts = file_name.split('Z')
    part1 = parts[0]
    part2 = parts[1]
    
    return part1, part2

def find_csv_files_to_rename(directory):
    for root, dirs, files in os.walk(directory):
        if 'rename' in root:
            for file_name in files:
                if file_name.endswith('.csv'):
                    original_file_path = os.path.join(root, file_name)
                    print(f"File Name: {file_name}, Extracted Info: {extract_info_from_filename(file_name)}")
                    extracted_parts = extract_info_from_filename(file_name)
                    new_file_name = f"{extracted_parts[0]}Z_treatment{extracted_parts[1]}"
                    print(f"New File name: {new_file_name}")
                    new_file_path = os.path.join(root, new_file_name)
                    print(f"New File Path Exists: {os.path.exists(new_file_path)}")
                    print(f"Original File Path Exists: {os.path.exists(original_file_path)}")
                    print(f"Root: {root}")
                    print(f"New file path: {new_file_path}")
                    if not os.path.exists(new_file_path):        
                        os.rename(original_file_path, new_file_path)
                        print(f'Renamed: {file_name} -> {new_file_name} \n')
                    else:
                        print(f'File already exists: {original_file_path} \n')

root_directory = 'input_files'
find_csv_files_to_rename(root_directory)

此修改后的代码使用

os.path.join()
创建
original_file_path
new_file_path
,这应该可以解决您遇到的
FileNotFoundError

© www.soinside.com 2019 - 2024. All rights reserved.