You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:17:00