标签: pathlib

为什么即使路径不存在,Path(...).exists 也为 true?

我应该要求用户输入一个目录,如果该目录不存在,我们告诉他们,然后为他们创建一个目录。

这是我到目前为止的代码。无论输入的路径的目录是否实际存在,它都会以相同的方式进行操作。在 Windows 上使用 pathlib 时会发生这种情况。错误报告 Issue35692

import pathlib
from pathlib import Path

def directory():

    p = Path(input("Enter file path: "))

    if p.exists:

        print('Exists')

        return p

    else:

        print('Directory does not exist. Making directory for you.')

        p.mkdir()



directory()
Run Code Online (Sandbox Code Playgroud)

python windows directory pathlib

5
推荐指数
1
解决办法
5204
查看次数

使用 Python pathlib 处理非 UTF-8 Posix 文件名?

我正在尝试使用已成为 Python 3.4+ 标准库一部分的 pathlib 模块来查找和操作文件路径。虽然它是对 os.path 样式函数的改进,能够以面向对象的方式处理路径,但我在处理 Posix 文件系统上的一些更奇特的文件名时遇到了麻烦;特别是名称包含无法解码为 UTF-8 的字节的文件:

>>> pathlib.PosixPath(b'\xe9')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/pathlib.py", line 969, in __new__
    self = cls._from_parts(args, init=False)
  File "/usr/lib/python3.5/pathlib.py", line 651, in _from_parts
    drv, root, parts = self._parse_args(args)
  File "/usr/lib/python3.5/pathlib.py", line 643, in _parse_args
    % type(a))
TypeError: argument should be a path or str object, not <class 'bytes'>

>>> b'\xe9'.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: …
Run Code Online (Sandbox Code Playgroud)

python posix utf-8 python-3.x pathlib

5
推荐指数
1
解决办法
2236
查看次数

pathlib Path 中斜线运算符和逗号分隔符的区别

,在pathlib我们可以通过创建一个子路径/两个路径之间,其中一个逗号也会工作。但是,我不知道这两种情况是否有区别。在以下示例中,输出相同:

from pathlib import Path

p = Path('/hello', 'world')
s = Path(p, 'how', 'are', 'you')
ns = Path(p / 'how', 'are', 'you')

print(s)
print(ns)
Run Code Online (Sandbox Code Playgroud)

但考虑到它pathlib是面向对象的,我想幕后可能会有一些不同的东西。/与逗号相比,在 Path 中使用有区别吗?

python python-3.x pathlib

5
推荐指数
1
解决办法
1842
查看次数

没有名为 pathlib2 的模块

我一直在努力让 Google Assistant 在我的 Raspberry Pi 3 上工作。它正在工作,但我在让这个特定步骤工作时遇到问题:https : //developers.google.com/assistant/sdk/guides/library/蟒蛇/扩展/句柄设备命令

此步骤包括向 Pi 发送开/关命令以打开或关闭 LED 灯泡。我已经确认面包板和 LED 设置正确,因为我可以通过 python 脚本打开或关闭 LED。

但是,按照该页面中的步骤并尝试运行以下命令“python hotword.py --device_model_id my-model”(实际上是:python hotword.py --device_model_id assistantraspi-1d671-pigooglev2-8n98u3)后,我得到以下错误:ImportError: No module named pathlib2

我包含了该文件的副本 (hotword.py)

#!/usr/bin/env python

# Copyright (C) 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
# …
Run Code Online (Sandbox Code Playgroud)

python json argparse pathlib google-assistant-sdk

5
推荐指数
1
解决办法
1万
查看次数

如何使用 Pathlib 在 Python 中迭代目录

我正在使用 Python 3,我需要对文件夹执行一些操作,使用 Pathlib 并检查它们是否是文件夹。

我要做的操作是这样的:

from pathlib import Path
source_path = Path("path_directory_string")

for a in source_path.iterdir():
    if a.is_dir():
        for b in a.iterdir():
            if b.is_dir():
                for c in b.iterdir():
                    if c.is_dir():
                        # do something
Run Code Online (Sandbox Code Playgroud)

我的问题是是否有更好的方法来做到这一点。回顾过去提出的问题,看起来最好的方法是使用 Pahtlib 的 glob 方法。因此,由于我有三个深度级别,所以我尝试了以下方法:

for a in source_path.glob("**/**/**"):
    if a.is_dir():
        print(a)
Run Code Online (Sandbox Code Playgroud)

它几乎可以工作了。问题是,这不仅返回最深层的文件夹,还返回它们的父文件夹。我在格式化 glob 模式时犯了一些错误吗?或者是否存在更好的方法来仅列出最深的_级别元素?

python directory glob subdirectory pathlib

5
推荐指数
1
解决办法
8035
查看次数

文件字符串pathlib的真实路径

我一直在寻找如何从pathlib.PosixPath使用路径库获取字符串格式的真实路径似乎花了几个小时。

我能找到的唯一解决方案是:

str(myPathObject.resolve())
Run Code Online (Sandbox Code Playgroud)

这看起来很混乱。我错过了什么还是这是唯一存在的解决方案?

编辑:

澄清一下,这给了我一个/opt/digglerz/projects字符串类型的文件路径,这就是我想要的。这似乎是一个很长的路要走,有没有更好的办法?

python pathlib

5
推荐指数
1
解决办法
8035
查看次数

使用 python -m pytest 与 pytest 时出现 FileNotFoundError

我最近将正在使用的 IDE 更改为 VSCode。在大多数情况下,我喜欢它,但有一个特定的问题我似乎无法解决。我也没有意识到这是一个问题,直到我移动了 IDE。

\n\n

我有一个这样的目录结构:

\n\n
my_app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 env\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib64 -> lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyvenv.cfg\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_app\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 expected_results\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test_data\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pytest.ini\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.cfg\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我启动虚拟环境时,我位于此目录结构的根目录下。

\n\n

我通过发出此命令(或提供其他选项)来运行测试。目前这有效:

\n\n
pytest\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当 VSCode 启动时,它会抛出一个错误,指出找不到所需的文件:

\n\n
E   FileNotFoundError: [Errno 2] No such file or directory: \'my_app/expected_results/expected_available_items.yml\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过一番调查,我发现这是因为 VSCode 启动时会发出以下命令:

\n\n
python -m pytest\n
Run Code Online (Sandbox Code Playgroud)\n\n

我通过这样做来设置该路径:

\n\n
import pathlib\nEXPECTED_RESULTS_BASE = pathlib.Path("my_app/expected_results")\nexpected_results = EXPECTED_RESULTS_BASE.joinpath(\'expected_available_items.yml\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要修改什么才能让我的测试在我发出命令时继续运行pytest并且在我(或显然是我的 IDE)出现问题时运行 …

python pytest pathlib visual-studio-code

5
推荐指数
1
解决办法
1万
查看次数

将字符串后置到文件名(使用 pathlib Path)

我经常想在文件名后添加一个字符串,同时保留扩展名。

定义一个函数来后置字符串似乎很麻烦。例如(使用pathlib的路径):

from pathlib import Path

def postpend(filename, string):
    filepath = Path(filename)
    return filepath.parent / (filepath.stem + string + filepath.suffix)
Run Code Online (Sandbox Code Playgroud)

是否有内置函数可以为我执行此操作?有没有更好的办法?

python path python-3.x pathlib

5
推荐指数
1
解决办法
1613
查看次数

在Google Colab中使用pathlib:AttributeError:'PosixPath'对象没有属性'ls'

如果我运行以下代码:

\n\n
from pathlib import Path\npath = Path(\'data/mnist\')\npath.ls()\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到以下错误:

\n\n
AttributeError: \xe2\x80\x98PosixPath\xe2\x80\x99 object has no attribute \xe2\x80\x98ls\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看pathlib中的Path类,我发现:

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

我猜这意味着它将运行 PosixPath,即:

\n\n
class PosixPath(Path, PurePosixPath):\n    """Path subclass for non-Windows systems.\n\n    On a POSIX system, instantiating a Path should return this object.\n …
Run Code Online (Sandbox Code Playgroud)

python pathlib

5
推荐指数
1
解决办法
7376
查看次数

避免递归树中的基本路径

我知道如何d:\temp使用各种方法递归列出所有文件/文件夹,请参阅如何使用 glob() 递归查找文件?.
但通常我想避免d:\temp\在结果中使用前缀,而是使用到此基的相对路径。

这可以通过以下方式完成:

这3个解决方案有效。但实际上,如果您阅读 的来源glob.py,它确实会累积/加入路径的所有部分。所以上面的解决方案是......“删除之前刚刚添加的内容”!它有效,但不是很优雅。同上用于pathlibrelative_to该删除的前缀。

问题:如何修改接下来的几行以使其不在d:\temp输出中(不删除之前连接的内容!)?

import os

def listpath(path):
    for f in os.scandir(path):
        f2 = os.path.join(path, f)
        if os.path.isdir(f):
            yield f2
            yield from listpath(f2)
        else:
            yield f2

for f in listpath('d:\\temp'):
    print(f)

#d:\temp\New folder
#d:\temp\New folder\New Text Document - …
Run Code Online (Sandbox Code Playgroud)

python glob os.path pathlib

5
推荐指数
1
解决办法
52
查看次数