我正在使用 pathlib 设置文件夹结构,我希望将树中所有文件夹的权限设置为 drwxrwx--- (770)。
我当前的代码是:
p=Path('name/{}/{}/{}/category'.format(year,month,day))
pp=Path('name/{}/{}/{}'.format(year,month,day))
p.mkdir(mode=0o770,parents=True,exist_ok=True)
Run Code Online (Sandbox Code Playgroud)
我需要exist_ok=True因为我希望在循环category值时使用同一条线。但是,在测试时我正在删除这些文件夹。
跑完之后,
oct(p.stat().st_mode)
0o40770
oct(pp.stat().st_mode)
0o40775
Run Code Online (Sandbox Code Playgroud)
即,父目录的默认权限为777(umask=002)。
我能想到的解决这个问题的唯一方法(似乎效率很低)是:
p.mkdir(mode=0o770,parents=True,exist_ok=True)
os.system("chmod -R 770 {}".format(name))
Run Code Online (Sandbox Code Playgroud)
有没有办法通过调用应用所需的权限Path().mkdir(),或者os.system()调用是不可避免的吗?
我正在尝试找到一种可读的方法来检查一条路径是否位于跨多个级别的另一条路径内。我可以检查直接父母,但到目前为止还不能超越。
import pathlib
path1 = pathlib.Path('/a/b')
path2 = pathlib.Path('/a/b/c/d')
path2.parent == path1 # <-- this is False, expected.
path2 in path1 # <-- this is False, UNEXPECTED.
Run Code Online (Sandbox Code Playgroud)
或者是转向字符串比较和startwith绝对路径检查的最佳选择?
在 Python 3.4 和 Ubuntu 14.04 中使用此代码不会返回 True
import pathlib
path1 = pathlib.Path("/tmp")
path2 = pathlib.Path("/tmp/../tmp")
print(path1 == path2)
# gives False
print(path1 is path2)
# gives False
Run Code Online (Sandbox Code Playgroud)
但通常“/tmp”和“/tmp/../tmp”是同一个文件夹。那么如何确保比较返回 True 呢?
如下代码:
from pathlib import Path
Desktop = Path('Desktop')
SubDeskTop = Desktop+"/subdir"
Run Code Online (Sandbox Code Playgroud)
得到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-eb31bbeb869b> in <module>()
1 from pathlib import Path
2 Desktop = Path('Desktop')
----> 3 SubDeskTop = Desktop+"/subdir"
TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str'
Run Code Online (Sandbox Code Playgroud)
我显然在这里做一些可疑的事情,但这引发了一个问题:如何访问Path对象的子目录?
在 Windows 7 x64 上使用 Python 3.6,该路径"C:"似乎与以下内容的空路径相同Path.resolve():
“空”路径是“当前工作目录” cwd():
>>> from pathlib import Path
>>> Path().resolve()
WindowsPath('C:/Users/me')
>>> Path(r"").resolve()
WindowsPath('C:/Users/me')
>>> Path.cwd().resolve()
WindowsPath('C:/Users/me')
Run Code Online (Sandbox Code Playgroud)
单个字母被解释为文件夹名称:
>>> Path(r"C").resolve()
WindowsPath('C:/Users/me/C')
Run Code Online (Sandbox Code Playgroud)
完整的驱动器号+冒号+反斜杠按预期指向驱动器根:
>>>> Path(r"C:\").resolve()
WindowsPath('C:/')
Run Code Online (Sandbox Code Playgroud)
但是忘记了反斜杠指向当前工作目录?
>>>> Path(r"C:").resolve()
WindowsPath('C:/Users/me/C')
Run Code Online (Sandbox Code Playgroud)
我希望它要么将冒号(不带反斜杠)视为常规字符(对于Path("te:st")),要么忽略它("C"),要么将路径视为驱动器根("C:\")。但相反,它似乎完全忽略了 C。
对于其他驱动器号("A:"、"X:"、...),解析要么无限期挂起(不好!),要么要求我将磁盘插入驱动器(这表明它也没有完全忽略驱动器号)。
我正在尝试返回特定位置中所有文件和子文件夹的列表。我的代码如下:
from pathlib import Path
FOLDER_PATH = Path(r'C:\long\file\path\of\138\characters\')
Run Code Online (Sandbox Code Playgroud)
我收到错误:
FileNotFoundError: [WinError 3] The system cannot find the path specified:
错误发生在文件夹路径上,而不是文件上,所以我不确定这是否可能是原因。
当我手动进入文件夹并尝试在其中打开文件夹时PDF,我收到“打开此文档时出错。找不到此文件。”
同样,当我尝试打开XLSX文件时,我得到“无法访问此文件。尝试以下操作之一:(确保它存在,不是只读的,不超过 218 个字符等)”
此文件夹中的文件路径肯定超过 218 个字符,我知道这可能是 Excel 的问题,但我不明白为什么pathlib.Path.rglob列出它们会有问题,有人理解吗?
但是,如果我使用CMD( dir /s /b > files.txt) 我可以得到列表。
此外,如果我随后在 python 中导入对象files.txt列表 ,并尝试执行,它将无法将某些较长的路径正确识别为文件。Pathpaths[x.is_file() for x in paths]
我已经验证,如果我在本地复制目录(其中存在更短的路径),则 Excel 和pathlib.Path.rglob.
可以做些什么来解决这个问题,为什么它首先是一个问题?
我对文件和当前编写方法相当陌生,我可以通过 file.pom 路径并检查 .jar 文件是否存在于同一路径中。
def get_file_type(self, file_path):
return pathlib.Path(file_path).suffix
def check_if_file_exists(self, pom_file_path, extension):
pom_file_extract_file = str(pom_file_path).rpartition("/")
pom_file_extract_filename = str(pom_file_extract_file [-1]).rpartition("-")
if pom_file_extract_filename ... # stuck
....
for file in files:
f = os.path.join(zip_path, file)
f_fixed = "." + f.replace("\\", "/")
if self.get_file_type(f_fixed) == ".pom":
pom_paths = (root + "/" + file).replace("\\", "/")
print(pom_paths)
# if self.check_if_file_exists(pom_paths, ".jar") == True:
# Do stuff...
Run Code Online (Sandbox Code Playgroud)
我应该通过pom的目录吗?
下面显示了我如何获取 user1 的主目录,创建一个新的子目录名称并通过 python 3.6 的os模块在那里创建一个新的子目录。
>>> import os.path
>>> import os
>>> a = os.path.expanduser('~')
>>> a
'/home/user1'
>>> a_sub_dir = a + '/Sub_Dir_1'
>>> a_sub_dir
'/home/user1/Sub_Dir_1'
>>> def create_sub_dir( sub_dir ):
try:
os.makedirs( sub_dir, mode=0o777, exist_ok=False )
except FileExistsError:
print('Sub_directory already exist, no action taken.')
else:
print('Created sub_directory.')
>>> create_sub_dir( a_sub_dir )
Created sub_directory.
>>> create_sub_dir( a_sub_dir )
Sub_directory already exist, no action taken.
Run Code Online (Sandbox Code Playgroud)
我想通过 python 3.6 的pathlib模块实现与上面相同的功能。但是,我似乎无法让它工作(见下文)。我的问题:
Path.expanduser()? 我可以知道如何在pathlib.Path.chmod(mode) 中定义模式。我在 python 3.6 文档中没有找到关于如何定义模式的任何解释或解释链接。例如
>>> p = Path( 'filename.ext' )
>>> p.stat().st_mode
33204
Run Code Online (Sandbox Code Playgroud)
这五个数字单独或一起的含义是什么?我想将值更改为,以便所有者具有执行权限。如何计算用于模式的值?
替代解决方案:
我要感谢@falsetru 的回答和评论。此外,我喜欢分享一种非数学方法来查找可以提交给pathlib.Path.chmod(mode)命令的所需权限级别的“模式值” 。
以下是步骤:
pathlib.Path.chmod(mode)命令中使用它。该程序采用一个可选的命令行参数(这是一个目录路径)
我正在使用 python pathlib 和 shutil 来移动文件。这是代码:
from pathlib import Path
path = Path(sys.argv[1])
shutil.move(path / file, path / e.upper())
Run Code Online (Sandbox Code Playgroud)
其中 e 只是一个代表特定文件扩展名的字符串;
输入:
python3 app.py /home/user/Desktop
Run Code Online (Sandbox Code Playgroud)
此代码生成错误:
'PosixPath' object has no attribute 'rstrip'
Run Code Online (Sandbox Code Playgroud)
如果我没有在命令行中指定第二个参数(并使用 Path.cwd() 作为路径),则 / 运算符可以正常工作
pathlib ×10
python ×9
python-3.x ×4
file ×2
path ×2
linux ×1
mkdir ×1
parent ×1
permissions ×1
ubuntu-18.04 ×1
unix ×1