一:概述
在开发中我们经常会使用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')
运行之后,出现错误爆出了以下的错误。
这个错误说明的是权限错误。
<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')
按照说的去修改权限,运行之后发现还是错误的。一开始以为是权限这个块通过代码可能出错了,然后手动通过修改权限,运行试试。
手动修改权限的的方法,打开创建的指定目录,右键点击该文件夹,然后点击属性
接着去将常规里面的属性只读不勾选。然后就完成了。
通过这个再去运行一下,然后运行之后还是报错了。想来这解决办法不是解决这个的。
注意:最后通过查看视频,发现,这个运行错误的原因是,在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')
运行之后,发现这个问题解决了。
<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这个函数参数中的源文件和符号链接都必须要使用绝对路径。