VSCode中PermissionError: [Errno 13]权限拒绝,移除相关代码仍报错求助
问题
运行Python代码时触发PermissionError: [Errno 13] Permission denied: './aws_s3/archive',即使删除了所有涉及该归档文件夹的代码段,错误依然存在。此前代码可正常访问该文件夹,已尝试重启VSCode、以管理员身份运行程序,且确认用户对目标文件夹拥有完全访问权限。当前代码中无任何对该归档文件夹的显式引用,但程序仍尝试访问它。
错误信息
PermissionError: [Errno 13] Permission denied: './aws_s3/archive'
当前代码
import boto3 import os import ignore.secrets as secrets import shutil # establish a connection s3 = boto3.client( 's3', region_name='us-east-1', aws_access_key_id=secrets.AWS_ACCESS_KEY_ID, aws_secret_access_key=secrets.AWS_SECRET_ACCESS_KEY ) #Create bucket bucket_name = 'well-logs' response = s3.create_bucket( Bucket=bucket_name ) print(response) # upload files csv_directory = './aws_s3/' for filename in os.listdir(csv_directory): file_path = os.path.join(csv_directory, filename) s3.upload_file(file_path, bucket_name, filename) # Confirm successful upload response = s3.list_objects(Bucket=bucket_name) objects = response.get('Contents', []) if objects: for obj in objects: print(obj['Key']) else: print("No objects found in the bucket.")
已移除的代码段(移除后仍报错)
# Archive files home_directory = './aws_s3/' archive_directory = './aws_s3/archive/' if not os.path.exists(archive_directory): os.makedirs(archive_directory) for filename in os.listdir(home_directory): source_file = os.path.join(home_directory, filename) destination_folder = archive_directory shutil.move(source_file, destination_folder)
完整错误栈
{'ResponseMetadata': {'RequestId': 'KRXB56SRP0ZSNRXY', 'HostId': 'dqLZ6yY8wcwX8zVIIhcemHwnATlu07hxmvs9EyChi/J5airBjle5mlHcD5rBd/VIo/0WqH5+n1Y=', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': 'dqLZ6yY8wcwX8zVIIhcemHwnATlu07hxmvs9EyChi/J5airBjle5mlHcD5rBd/VIo/0WqH5+n1Y=', 'x-amz-request-id': 'KRXB56SRP0ZSNRXY', 'date': 'Sun, 04 Jun 2023 21:25:51 GMT', 'location': '/well-logs', 'server': 'AmazonS3', 'content-length': '0'}, 'RetryAttempts': 0}, 'Location': '/well-logs'} Traceback (most recent call last): File "d:\ds_projects\dcj-manufacturing-oil-rig\upload-aws.py", line 28, in <module> s3.upload_file(file_path, bucket_name, filename) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\boto3\s3\inject.py", line 143, in upload_file return transfer.upload_file( File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\boto3\s3\transfer.py", line 292, in upload_file future.result() File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\futures.py", line 103, in result return self._coordinator.result() File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\futures.py", line 266, in result raise self._exception File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\tasks.py", line 139, in __call__ return self._execute_main(kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\tasks.py", line 162, in _execute_main return_value = self._main(**kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\upload.py", line 758, in _main client.put_object(Bucket=bucket, Key=key, Body=body, **extra_args) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\client.py", line 530, in _api_call return self._make_api_call(operation_name, kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\client.py", line 933, in _make_api_call handler, event_response = self.meta.events.emit_until_response( File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\hooks.py", line 416, in emit_until_response return self._emitter.emit_until_response(aliased_event_name, **kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\hooks.py", line 271, in emit_until_response responses = self._emit(event_name, kwargs, stop_on_response=True) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\hooks.py", line 239, in _emit response = handler(**kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\utils.py", line 3088, in conditionally_calculate_md5 md5_digest = calculate_md5(body, **kwargs) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\utils.py", line 3055, in calculate_md5 binary_md5 = _calculate_md5_from_file(body) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\utils.py", line 3067, in _calculate_md5_from_file for chunk in iter(lambda: fileobj.read(1024 * 1024), b''): File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\botocore\utils.py", line 3067, in <lambda> for chunk in iter(lambda: fileobj.read(1024 * 1024), b''): File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\utils.py", line 511, in read data = self._fileobj.read(amount_to_read) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\upload.py", line 91, in read return self._fileobj.read(amount) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\utils.py", line 370, in read self._open_if_needed() File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\utils.py", line 361, in _open_if_needed self._fileobj = self._open_function(self._filename, self._mode) File "d:\ds_projects\dcj-manufacturing-oil-rig\env\lib\site-packages\s3transfer\utils.py", line 272, in open return open(filename, mode) PermissionError: [Errno 13] Permission denied: './aws_s3/archive'
解决方案
问题根源是os.listdir('./aws_s3/')会遍历目录下的所有条目,包括文件夹。当代码尝试用s3.upload_file()上传./aws_s3/archive这个文件夹时,upload_file试图打开文件夹当作文件读取,从而触发权限错误(系统不允许以读文件的方式打开文件夹)。
修改上传文件的代码段,添加过滤条件,只处理文件:
# upload files csv_directory = './aws_s3/' for filename in os.listdir(csv_directory): file_path = os.path.join(csv_directory, filename) # 只处理文件,跳过目录 if os.path.isfile(file_path): s3.upload_file(file_path, bucket_name, filename)
如果需要只上传特定类型的文件(比如CSV),可以再加一层过滤:
# upload files csv_directory = './aws_s3/' for filename in os.listdir(csv_directory): file_path = os.path.join(csv_directory, filename) # 只处理CSV文件,跳过目录和其他类型文件 if os.path.isfile(file_path) and filename.endswith('.csv'): s3.upload_file(file_path, bucket_name, filename)
内容的提问来源于stack exchange,提问作者Gregory Morris
相关产品推荐
相关产品推荐

