首页 > 编程语言 >用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied: 'temp'以及os.symlink()

用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied: 'temp'以及os.symlink()

时间:2023-12-29 22:32:12浏览次数:44  
标签:13 文件属性 temp 报错 file test txt os dir

一:概述

在开发中我们经常会使用python程序去对物理主机平台上的文件进行操作,在这里说明一下,python中获取文件属性时,运行出现的错误。

二:具体说明

<1>获取文件属性的代码

import os
# 创建一个临时目录
temp_dir = 'temp'
os.mkdir(temp_dir)

# 在临时目录中创建一个文件
temp_file = os.path.join(temp_dir, 'test.txt')
with open(temp_file, 'w') as f:
    f.write('test')
# 设置文件的读取权限
# os.chmod('test.txt', 0o777)
# os.chmod('temp', 0o777)
# 获取临时目录文件描述符
# Linux和MacOS中
dir_fd = os.open(temp_dir, os.O_RDONLY)
# 使用dir_fd参数获取文件属性信息
file_info = os.stat("test.txt",dir_fd=dir_fd)
print(f"file size:{file_info.st_size}")

# 关闭文件描述符
os.close(dir_fd)

# 删除临时文件和目录
os.remove(temp_file)
os.rmdir(temp_dir)

# 创建符号链接
os.symlink('test.txt', 'test_link.txt')

# 获取链接文件指向源文件的属性
file_info = os.stat('test_link.txt')
print(f"file size:{file_info.st_size}")

# 获取链接文件本身的属性
file_info = os.stat('test_link.txt', follow_symlinks=False)
print(f"Link file size:{file_info.st_size}")

# 删除符号链接
os.unlink('test_link.txt')

运行之后,出现错误爆出了以下的错误。

用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied:

这个错误说明的是权限错误。

<2>解决办法1

百度搜索之后,看到了一个解决办法就是利用os.chmod函数去赋予这个权限。尝试使用这个办法解决。

修改的代码如下:

import os
# 创建一个临时目录
temp_dir = 'temp'
os.mkdir(temp_dir)

# 在临时目录中创建一个文件
temp_file = os.path.join(temp_dir, 'test.txt')
with open(temp_file, 'w') as f:
    f.write('test')
# 设置文件的读取权限
os.chmod('test.txt', 0o777)
os.chmod('temp', 0o777)
# 获取临时目录文件描述符
# Linux和MacOS中
dir_fd = os.open(temp_dir, os.O_RDONLY)
# 使用dir_fd参数获取文件属性信息
file_info = os.stat("test.txt",dir_fd=dir_fd)
print(f"file size:{file_info.st_size}")

# 关闭文件描述符
os.close(dir_fd)

# 删除临时文件和目录
os.remove(temp_file)
os.rmdir(temp_dir)

# 创建符号链接
os.symlink('test.txt', 'test_link.txt')

# 获取链接文件指向源文件的属性
file_info = os.stat('test_link.txt')
print(f"file size:{file_info.st_size}")

# 获取链接文件本身的属性
file_info = os.stat('test_link.txt', follow_symlinks=False)
print(f"Link file size:{file_info.st_size}")

# 删除符号链接
os.unlink('test_link.txt')

按照说的去修改权限,运行之后发现还是错误的。一开始以为是权限这个块通过代码可能出错了,然后手动通过修改权限,运行试试。

手动修改权限的的方法,打开创建的指定目录,右键点击该文件夹,然后点击属性

用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied:

接着去将常规里面的属性只读不勾选。然后就完成了。

用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied:

通过这个再去运行一下,然后运行之后还是报错了。想来这解决办法不是解决这个的。

注意:最后通过查看视频,发现,这个运行错误的原因是,在Linux平台上,Macos,Linux台上这个使用方法是不一样的。这个os.open()函数在Linux和MacOS平台上可以将目录打开,在Windows平台上使用os.open函数打开目录时会爆出权限错误。

<3>解决办法2

对代码进行修改,将文件路径直接修改为目录名,修改后的代码如下:

import os
# 创建一个临时目录
temp_dir = 'temp'
os.mkdir(temp_dir)

# 在临时目录中创建一个文件
temp_file = os.path.join(temp_dir, 'test.txt')
with open(temp_file, 'w') as f:
    f.write('test')

# # 获取临时目录文件描述符
# dir_fd = os.open(temp_dir, os.O_RDONLY)
# 使用dir_fd参数获取文件属性信息
file_info = os.stat(temp_file)
print(f"file size:{file_info.st_size}")

# 删除临时文件和目录
os.remove(temp_file)
os.rmdir(temp_dir)

# 创建符号链接
os.symlink('test.txt', 'test_link.txt')

# 获取链接文件指向源文件的属性
file_info = os.stat('test_link.txt')
print(f"file size:{file_info.st_size}")

# 获取链接文件本身的属性
file_info = os.stat('test_link.txt', follow_symlinks=False)
print(f"Link file size:{file_info.st_size}")

# 删除符号链接
os.unlink('test_link.txt')

运行之后,发现这个问题解决了。

用python打开文件获取文件属性时,运行报错PermissionError: [Errno 13] Permission denied:

<4>上面这个问题知道原因之后,解决了,但是随之又出现了另一个问题。

Traceback (most recent call last):
  File "D:\PyCharmProjects\Python-knowledges\file_system\stat_demo_windows.py", line 35, in <module>
    os.symlink('test.txt', 'test_link.txt')
OSError: symbolic link privilege not held

这个问题是软连接不能被授予权限。我的电脑暂时还没解决。这个问题找了找,发现是我的电脑的问题。解决办法比较麻烦。解决链接如下。我使用的电脑是Win10的家庭版本,如果你使用的是其他系统的电脑说不定就不会出现这个问题,如果出现了这个错误。我个人认为只要知道原因就可以了。直接在Linux系统中就不会出现这个错误。在这个问题上花费太多的时间意义不大。主要是知道有这个错误和这个知识点。

注意:在Windos环境下,symlink这个函数参数中的源文件和符号链接都必须要使用绝对路径。

软连接授予权限问题




标签:13,文件属性,temp,报错,file,test,txt,os,dir
From: https://blog.51cto.com/u_15912723/9032220

相关文章

  • 下载文件报错:java.io.IOException: UT010029: Stream is closed
    在项目中使用EasyExcel导出excel然后压缩成压缩包下载,下载也是能正常下载就是会抛出这个错误虽然说这个错误不影响下载功能,搞不好就因为这个错误某天系统崩溃,那时候就不是这么好玩了,于是我在百度上疯狂查找有的说是流没有关,要在finally里面把流关了关了之后,满怀期待的重新运......
  • 文心一言 VS 讯飞星火 VS chatgpt (167)-- 算法导论13.1 7题
    七、用go语言,试描述一棵含有n个关键字的红黑树,使其红色内部结点个数与黑色内部结点个数的比值最大。这个比值是多少?该比值最小的树又是怎样呢?比值是多少?文心一言:红黑树是一种自平衡的二叉查找树,它满足以下性质:每个节点或是红色,或是黑色。根节点是黑色。每个叶节点(NIL或空节......
  • P9994 [Ynoi Easy Round 2024] TEST_132 题解
    题解怎么都是用暴力日过去的啊。思路考虑根号分治,设阈值为\(B\)。对于第二维出现次数超过\(B\)的,我们可以在修改时暴力更改,这部分复杂度为\(O(\frac{nm}{B})\)。对于第二维出现次数小于\(B\)的,我们可以在修改是打标记,查询时遍历一遍,这部分的复杂度为\(O(mb)\)。大多数......
  • vscode的ssh连接报错过程试图写入的管道不存在
    报错[15:38:48.548]Runningscriptwithconnectioncommand:"C:\Windows\System32\OpenSSH\ssh.exe"-T-D11892"nvidia@nvidia"bash[15:38:48.569]Terminalshellpath:C:\Windows\System32\cmd.exe[15:38:53.152]>ssh:Couldnot......
  • python json.dump 将字典写文件json文件后多了一个花括号"}",读取时报错:json.decoder.
    问题复现我的字典格式:importjsond={'Demo':{'Total_Result':'Pass','info':{'test3':'Pass'}},'10.0.0.111':{'Total_Result':'Pass','info':{'test......
  • BUG分享|报错:Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);移植FreeR
    引言在移植FreeRTOS到STM32F411CEU6上时,出现了烧录一次后,无法再次烧录的情况。现象烧录时报错:CannotaccessMemory(@0xe00fffe4,Read,AccSize:4Byte);弹窗:Connectionrefusedduetodevicemismatch!单片机:STM32F411CEU6烧录器:DAPLink现象:修改代码后,第一次可以......
  • Citrix ADC Release 13.0 Build 92.18 发布 - 混合多云应用交付控制器
    CitrixADCRelease13.0Build92.18发布-混合多云应用交付控制器CitrixADCRelease13.0Build92.18(nCore,VPX,SDX,CPX,BLX)CitrixADC-混合多云应用交付控制器作者主页:sysin.org大规模应用程序交付可能很复杂。使用NetScaler让一切变得更简单。产品概述CitrixAD......
  • 【随手记录】Apache-JMeter部署银河麒麟报错: jmeter module java.desktop does not "o
    操作系统:Linux0012.novalocal4.19.90-17.ky10.aarch64#1SMPSunJun2814:27:40CST2020aarch64aarch64aarch64GNU/LinuxJDK版本:java17.0.82023-07-18LTSJava(TM)SERuntimeEnvironment(build17.0.8+9-LTS-211)JavaHotSpot(TM)64-BitServerVM(build......
  • 13 SPI通信协议原理
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MILIANKE)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述SPI是一种串行总线接口,也是各类嵌入式设备以及FPGA应用开发中常用的一种串行通信接口。SPI的接口速度......
  • .net 6 post 接口传递json数据,接口实体对象反序列化导致一些可空字段报错 field is re
    1现象接口定义 swagger请求 正常来讲,string类型默认为null的2原因C#8.0引入了“可为空引用类型”和“不可为空引用类型”,使我们能够对引用类型变量的属性作出重要声明 3解决方法a)json对象的反序列化对象添加可空修饰符?b)全局配置//关闭不可为空引用类型......