Python脚本执行遇PermissionError:文件夹权限问题求助
解决PermissionError: [Errno 13] Permission denied 错误
环境信息
- Python 3.9.12
- Windows 10 x64
报错信息
Traceback (most recent call last): File "c:\Users\Dell Latitude 7480\Desktop\HC\HC.CHECKER.py", line 17, in read_file = pd.read_excel(abs_folder_path, sheet_name = 'MSAN Cabinets') File "C:\Users\Dell Latitude 7480\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\util_decorators.py", line 311, in wrapper return func(*args, **kwargs) File "C:\Users\Dell Latitude 7480\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\excel_base.py", line 457, in read_excel io = ExcelFile(io, storage_options=storage_options, engine=engine) File "C:\Users\Dell Latitude 7480\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\excel_base.py", line 1376, in __init__ ext = inspect_excel_format( File "C:\Users\Dell Latitude 7480\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\excel_base.py", line 1250, in inspect_excel_format with get_handle( File "C:\Users\Dell Latitude 7480\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\common.py", line 795, in get_handle handle = open(handle, ioargs.mode) PermissionError: [Errno 13] Permission denied: 'C:\Users\Dell Latitude 7480\Desktop\HC'
原脚本代码
import pandas as pd import numpy as np import os print("Fixed Network Health Check Checker") folder_path = name = input("Enter the folder path of your Raw files: ") abs_folder_path = os.path.abspath(folder_path) read_file = pd.read_excel(abs_folder_path, sheet_name = 'MSAN Cabinets') read_file.to_csv(abs_folder_path, index = None, header = True) df = pd.read_csv(abs_folder_path, encoding='unicode_escape') #fixed df['MSAN Interface'] = df['MSAN Interface'].replace(np.nan, 0) df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] = df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'].replace(np.nan, 0) df['Homing AG2'] = df['Homing AG1'].replace(np.nan, 0) df = df.iloc[:11255] # filter "REGION" and drop unnecessary columns f_df1 = df[df['REGION'] == 'MIN'] dropcols_df1 = f_df1.drop(df.iloc[:, 1:6], axis = 1) dropcols_df2 = dropcols_df1.drop(df.iloc[:, 22:27], axis = 1) dropcols_df3 = dropcols_df2.drop(df.iloc[:, 37:50], axis = 1) # filter "MSAN Interface" and filter the peak util for >= 50% f_d2 = dropcols_df3['MSAN Interface'] != 0 msan_int = dropcols_df3[f_d2] f_msan_int = msan_int['Peak Util'] >= 0.5 new_df = msan_int[f_msan_int] # filter "ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)" and filter the peak util for >= 50% fblank_msan_int = dropcols_df3['MSAN Interface'] == 0 msan_int1 = dropcols_df3[fblank_msan_int] f_df3 = dropcols_df3['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] != 0 access_int1 = dropcols_df3[f_df3] f_access_int1 = access_int1['Peak Util.1'] >= 0.5 new_df1 = access_int1[f_access_int1] # filter "Homing AG1" and filter the peak util for >= 50% fblank_msan_int1 = dropcols_df3['MSAN Interface'] == 0 msan_int2 = dropcols_df3[fblank_msan_int1] f_access_int2 = msan_int2['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] == 0 new_df2 = msan_int2[f_access_int2] ag1 = new_df2['Peak Util.3'] >= 0.5 new_df3 = new_df2[ag1] # Concatenate all DataFrames pdList = [new_df, new_df1, new_df3] final_df = pd.concat(pdList) print(final_df.to_csv('output.csv', index = False))
错误原因
- 路径类型错误:传入
pd.read_excel()的是文件夹路径,但该函数要求传入具体的Excel文件路径,尝试读取文件夹会触发权限拒绝错误。 - 写入路径错误:后续
read_file.to_csv()同样传入文件夹路径,会尝试将文件夹作为文件写入,进一步引发权限问题。 - 冗余操作:将Excel转成CSV再读取是多余的,直接使用
pd.read_excel()返回的DataFrame即可处理,无需额外转存。
修复方案
方案1:修改输入为具体Excel文件路径
调整脚本,让用户输入目标Excel文件的完整路径,同时移除冗余的CSV转存步骤:
import pandas as pd import numpy as np import os print("Fixed Network Health Check Checker") # 改为输入具体Excel文件路径 file_path = input("Enter the full path of your Excel raw file: ") abs_file_path = os.path.abspath(file_path) # 直接读取Excel文件,无需转CSV df = pd.read_excel(abs_file_path, sheet_name='MSAN Cabinets') #fixed df['MSAN Interface'] = df['MSAN Interface'].replace(np.nan, 0) df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] = df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'].replace(np.nan, 0) df['Homing AG2'] = df['Homing AG1'].replace(np.nan, 0) df = df.iloc[:11255] # filter "REGION" and drop unnecessary columns f_df1 = df[df['REGION'] == 'MIN'] dropcols_df1 = f_df1.drop(df.iloc[:, 1:6], axis=1) dropcols_df2 = dropcols_df1.drop(df.iloc[:, 22:27], axis=1) dropcols_df3 = dropcols_df2.drop(df.iloc[:, 37:50], axis=1) # filter "MSAN Interface" and filter the peak util for >= 50% f_d2 = dropcols_df3['MSAN Interface'] != 0 msan_int = dropcols_df3[f_d2] f_msan_int = msan_int['Peak Util'] >= 0.5 new_df = msan_int[f_msan_int] # filter "ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)" and filter the peak util for >= 50% fblank_msan_int = dropcols_df3['MSAN Interface'] == 0 msan_int1 = dropcols_df3[fblank_msan_int] f_df3 = dropcols_df3['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] != 0 access_int1 = dropcols_df3[f_df3] f_access_int1 = access_int1['Peak Util.1'] >= 0.5 new_df1 = access_int1[f_access_int1] # filter "Homing AG1" and filter the peak util for >= 50% fblank_msan_int1 = dropcols_df3['MSAN Interface'] == 0 msan_int2 = dropcols_df3[fblank_msan_int1] f_access_int2 = msan_int2['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] == 0 new_df2 = msan_int2[f_access_int2] ag1 = new_df2['Peak Util.3'] >= 0.5 new_df3 = new_df2[ag1] # Concatenate all DataFrames pdList = [new_df, new_df1, new_df3] final_df = pd.concat(pdList) # 输出到指定CSV文件 final_df.to_csv('output.csv', index=False) print("Processing completed. Output saved to output.csv")
方案2:自动遍历文件夹中的Excel文件(如果有多个文件)
如果需要处理文件夹下所有Excel文件,可添加遍历逻辑:
import pandas as pd import numpy as np import os print("Fixed Network Health Check Checker") folder_path = input("Enter the folder path of your Raw files: ") abs_folder_path = os.path.abspath(folder_path) # 遍历文件夹下所有Excel文件 for filename in os.listdir(abs_folder_path): if filename.endswith('.xlsx') or filename.endswith('.xls'): file_path = os.path.join(abs_folder_path, filename) df = pd.read_excel(file_path, sheet_name='MSAN Cabinets') # 后续处理逻辑与方案1一致 df['MSAN Interface'] = df['MSAN Interface'].replace(np.nan, 0) df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] = df['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'].replace(np.nan, 0) df['Homing AG2'] = df['Homing AG1'].replace(np.nan, 0) df = df.iloc[:11255] f_df1 = df[df['REGION'] == 'MIN'] dropcols_df1 = f_df1.drop(df.iloc[:, 1:6], axis=1) dropcols_df2 = dropcols_df1.drop(df.iloc[:, 22:27], axis=1) dropcols_df3 = dropcols_df2.drop(df.iloc[:, 37:50], axis=1) f_d2 = dropcols_df3['MSAN Interface'] != 0 msan_int = dropcols_df3[f_d2] f_msan_int = msan_int['Peak Util'] >= 0.5 new_df = msan_int[f_msan_int] fblank_msan_int = dropcols_df3['MSAN Interface'] == 0 msan_int1 = dropcols_df3[fblank_msan_int] f_df3 = dropcols_df3['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] != 0 access_int1 = dropcols_df3[f_df3] f_access_int1 = access_int1['Peak Util.1'] >= 0.5 new_df1 = access_int1[f_access_int1] fblank_msan_int1 = dropcols_df3['MSAN Interface'] == 0 msan_int2 = dropcols_df3[fblank_msan_int1] f_access_int2 = msan_int2['ACCESS Interface 1 (IPRAN, ATN, LSA, VLAN)'] == 0 new_df2 = msan_int2[f_access_int2] ag1 = new_df2['Peak Util.3'] >= 0.5 new_df3 = new_df2[ag1] pdList = [new_df, new_df1, new_df3] final_df = pd.concat(pdList) # 按原文件名生成输出CSV output_filename = f"output_{os.path.splitext(filename)[0]}.csv" final_df.to_csv(output_filename, index=False) print(f"Processed {filename}, output saved to {output_filename}")
额外注意事项
- 确保运行脚本时拥有目标文件夹/文件的读写权限,必要时右键以管理员身份运行Python脚本。
- 确认Excel文件未被其他程序(如Excel客户端)占用,否则会触发权限错误。
内容的提问来源于stack exchange,提问作者Joshua Aquino
相关产品推荐
相关产品推荐

