标签: pathlib

循环结果来自Path.glob()(Pathlib)

我正在努力解决Python 3.6中Pathlib模块的Path.glob()方法的结果.

from pathlib import Path

dir = Path.cwd()

files = dir.glob('*.txt')
print(list(files))
>> [WindowsPath('C:/whatever/file1.txt'), WindowsPath('C:/whatever/file2.txt')]

for file in files:
    print(file)
    print('Check.')
>>
Run Code Online (Sandbox Code Playgroud)

显然,glob找到了文件,但是没有执行for循环.如何循环pathlib-glob-search的结果?

python glob pathlib

9
推荐指数
1
解决办法
5694
查看次数

我应该什么时候使用 pathlib.Path.mkdir() 与 os.mkdir() 或 os.makedirs()?

根据 python 3.6 文档,可以通过以下方式创建目录:

  1. pathlib.Path.mkdir(mode=0o777, parents=False, exist_ok=False)
  2. os.mkdir(path, mode=0o777, *, dir_fd=None)
  3. os.makedirs(name, mode=0o777, exist_ok=False)

问题:

  1. 它看起来像pathlib.Path.mkdir()做了大部分什么os.mkdir()os.makedirs()做什么。是pathlib.Path.mkdir()一个“现代”的实施两者的os.mkdir()os.makedirs()
  2. 我什么时候应该使用pathlib.Path.mkdir()vsos.mkdir()os.makedirs()? 有什么性能差异吗?

请解释有关 POSIX 的注意事项。谢谢。

python directory subdirectory pathlib

9
推荐指数
1
解决办法
6660
查看次数

如何使用 Pathlib 检查文件夹/文件权限

是否有 Pathlib 等价物os.access()

如果没有 Pathlib,代码将如下所示:

import os
os.access('my_folder', os.R_OK)  # check if script has read access to folder
Run Code Online (Sandbox Code Playgroud)

但是,在我的代码中,我正在处理 Pathlib 路径,因此我需要这样做(这只是一个示例):

# Python 3.5+
from pathlib import Path
import os

# get path ~/home/github if on Linux
my_folder_pathlib = Path.home() / "github"
os.access(str(my_folder_pathlib), os.R_OK)
Run Code Online (Sandbox Code Playgroud)

演员str()阵容有点丑。我想知道我想要实现的目标是否有纯 Pathlib 解决方案

ps 我知道“更容易请求宽恕”的原则,但是这是一个更大框架的一部分,我需要尽快知道脚本是否具有对 NAS 存储文件夹的正确权限。

python python-3.x pathlib

9
推荐指数
1
解决办法
2171
查看次数

如何使用pathlib glob 两种模式?

我想找到具有两种不同扩展名的两种类型的文件:.jl.jsonlines. 我用

from pathlib import Path
p1 = Path("/path/to/dir").joinpath().glob("*.jl")
p2 = Path("/path/to/dir").joinpath().glob("*.jsonlines")
Run Code Online (Sandbox Code Playgroud)

但我想要p1p2作为一个变量而不是两个。我应该合并p1,并p2在首位?还有其他方法可以连接 glob 的模式吗?

python pathlib

8
推荐指数
3
解决办法
7592
查看次数

用熊猫处理路径的最佳方法

当我有一个pd.DataFramewith 路径时,我最终做了很多.map(lambda path: Path(path).{method_name},或者apply(axis=1)例如:

(
    pd.DataFrame({'base_dir': ['dir_A', 'dir_B'], 'file_name': ['file_0', 'file_1']})
    .assign(full_path=lambda df: df.apply(lambda row: Path(row.base_dir) / row.file_name, axis=1))
)
  base_dir file_name     full_path
0    dir_A    file_0  dir_A/file_0
1    dir_B    file_1  dir_B/file_1
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪,尤其是因为pathlib确实实现了,/所以类似的东西df.base_dir / df.file_name会更加 Pythonic 和自然。

我还没有找到path在 Pandas 中实现的任何类型,有什么我遗漏的吗?

编辑

我发现最好一次做一次,astype(path)然后至少对路径连接进行pathlib矢量化:

(
    pd.DataFrame({'base_dir': ['dir_A', 'dir_B'], 'file_name': ['file_0', 'file_1']})
    # this is where I would expect `astype({'base_dir': Path})`
    .assign(**{col_name:lambda df: df[col_name].map(Path) for col_name …
Run Code Online (Sandbox Code Playgroud)

python pandas pathlib

8
推荐指数
1
解决办法
572
查看次数

如何创建一个以点为起点的pathlib相对路径?

我需要创建一个以当前目录开头的相对路径“.” 点

例如,在 Windows 中“.\envs\.some.env”或其他地方的“./envs/.some.env”

我想使用 pathlib 来做到这一点。找到了解决方案,但它有一个笨拙的替换语句。有没有更好的方法使用 pathlib 来做到这一点?

用法是 django-environ,目标是支持多个 env 文件。工作文件夹包含一个 envs 文件夹,该文件夹中包含多个 env 文件。

import environ
from pathlib import Path
import os

domain_env = Path.cwd()

dotdot = Path("../")
some_env = dotdot / "envs" / ".some.env"

envsome = environ.Env()
envsome.read_env(envsome.str(str(domain_env), str(some_env).replace("..", ".")))  

print(str(some_env))
print(str(some_env).replace("..", "."))

dot = Path("./")    # Path(".") gives the same result
some_env = dot / "envs" / ".some.env"

print(str(some_env))
Run Code Online (Sandbox Code Playgroud)

在 Windows 上给出:

..\envs\.some.env
.\envs\.some.env
envs\.some.env
Run Code Online (Sandbox Code Playgroud)

python django environment-variables pathlib

8
推荐指数
2
解决办法
3997
查看次数

如何在 Windows 上使用 pathlib 输出带有正斜杠的路径?

如何使用pathlib输出带有正斜杠的路径?我经常遇到只接受带有正斜杠的路径的程序,但我不知道如何让 pathlib 为我做到这一点。

from pathlib import Path, PurePosixPath

native = Path('c:/scratch/test.vim')
print(str(native))
# Out: c:\scratch\test.vim
# Backslashes as expected.

posix = PurePosixPath(str(native))
print(str(posix))
# Out: c:\scratch\test.vim
# Why backslashes again?

posix = PurePosixPath('c:/scratch/test.vim')
print(str(posix))
# Out: c:/scratch/test.vim
# Works, but only because I never used a Path object

posix = PurePosixPath(str(native))
print(str(posix).replace('\\', '/'))
# Out: c:/scratch/test.vim
# Works, but ugly and may cause bugs
Run Code Online (Sandbox Code Playgroud)

PurePosixPathpathlib 中没有unlinkglob、 和其他有用的实用程序,因此我不能专门使用它。PosixPath在 Windows 上抛出 NotImplementedError。

这是必要的实际用例:zipfile.ZipFile需要正斜杠,但在给定反斜杠时无法匹配路径。 …

python pathlib

8
推荐指数
1
解决办法
5614
查看次数

Python 3.4+:扩展pathlib.Path

下面的代码是我首先尝试的,但some_path.with_suffix('.jpg')显然返回一个pathlib.PosixPath对象(我在Linux上)而不是我的版本PosixPath,因为我没有重新定义with_suffix.我是否必须复制所有内容pathlib或有更好的方法吗?

import os
import pathlib
from shutil import rmtree


class Path(pathlib.Path):

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        self = cls._from_parts(args, init=False)
        if not self._flavour.is_supported:
            raise NotImplementedError("cannot instantiate %r on your system"
                                      % (cls.__name__,))
        self._init()
        return self

    def with_stem(self, stem):
        """
        Return a new path with the stem changed.

        The stem is the final path component, minus its last suffix. …
Run Code Online (Sandbox Code Playgroud)

python path python-3.x pathlib

7
推荐指数
1
解决办法
1262
查看次数

为什么 pathlib.Path(__file__).parent.parent 对我的工作目录敏感?

我有一个位于两个目录下的脚本。

\n
\xe2\x9d\xaf tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\n\xe2\x9d\xaf cd foo/bar\n\xe2\x9d\xaf cat test.py\n\n    from pathlib import Path\n    print(Path(__file__).parent)\n    print(Path(__file__).parent.parent)\n
Run Code Online (Sandbox Code Playgroud)\n

当我从包含该文件的目录运行它时,PathLib 认为该文件的祖父与其父级相同。

\n
\xe2\x9d\xaf python test.py\n\n    . # <-- same\n    . # <-- directories\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我从顶层运行它时,PathLib 行为正确。

\n
\xe2\x9d\xaf cd ../..\n\xe2\x9d\xaf python foo/bar/test.py\n\n    foo/bar # <-- different\n    foo     # <-- directories\n
Run Code Online (Sandbox Code Playgroud)\n

我是否误解了 PathLib 的 API,或者是否有其他原因导致其输出对我的工作目录敏感?

\n

python pathlib

7
推荐指数
1
解决办法
6768
查看次数

如何正确使用 Pathlib 中的正则表达式?

我想找到所有图像并尝试使用 pathlib,但我的 reg 表达式不起作用。我哪里错了?

from pathlib import Path
FILE_PATHS=list(Path('./photos/test').rglob('*.(jpe?g|png)'))
print(len(FILE_PATHS))
FILE_PATHS=list(Path('./photos/test').rglob('*.jpg'))#11104
print(len(FILE_PATHS))

0
11104
Run Code Online (Sandbox Code Playgroud)

python glob pathlib

7
推荐指数
1
解决办法
5973
查看次数