标签: pathlib

如何以正确的方式使用python中的pathlib排除路径目录中的文件?

我有一个文件的数据路径,其中有几个数据文件,例如 data01.txt、data02.txt 等。在处理过程中,用户将为数据提供掩码文件(也可能通过外部工具)。掩码文件将包含字符串“mask”,例如data01-mask.txt。

from pathlib import Path
p = Path(C:\Windowns\test\data01.txt)
dircontent = list(p.parent.glob('*'))
Run Code Online (Sandbox Code Playgroud)

为我提供所有文件路径作为对象的列表,Path包括潜在的掩码。现在我想要一个列表,它为我提供目录内容,但不包括任何包含掩码的文件。我尝试过这种方法来使用奇特的正则表达式*![mask]*,但我没有让它工作。

使用,

dircontentstr = [str(elem) for elem in x]
filtereddir = [elem.find('mask') for elem in dircontentstr if elem.find('mask')==-1]
Run Code Online (Sandbox Code Playgroud)

我可以获得所需的结果,但然后转换回Path元素似乎很愚蠢。有没有直接的方法从目录列表中排除?

python pathlib

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

Pathlib和stem - Attributerror

作为代码的一部分,我的功能如下:

def match_output(orig_path: Path,lines: Iterable[str],stem: str, delim: str,delim_pred: Callable[[int], bool],) -> Iterable:
    n = 0
    path = orig_path.with_stem(f'{orig_path.stem}_{stem}')

    with path.open('w') as f:
        for line in lines:
            n_delim = line.count(delim)
            matched = delim_pred(n_delim)
            if matched:
                f.write(line)

            n += int(matched)
            yield

    logger.info(f'Number of {stem} lines: {n}')
Run Code Online (Sandbox Code Playgroud)

但是,我遇到属性错误,无法解决,请问有什么建议吗?

Traceback (most recent call last):
  File "C:/Users/HAXY8W/Desktop/pieter_code_rewriting/main.py", line 95, in <module>
    main()
  File "C:/Users/HAXY8W/Desktop/pieter_code_rewriting/main.py", line 88, in main
    process(
  File "C:/Users/HAXY8W/Desktop/pieter_code_rewriting/main.py", line 82, in process
    for n_lines, _ in enumerate(zip(*iters)):
  File "C:/Users/HAXY8W/Desktop/pieter_code_rewriting/main.py", line 27, in …
Run Code Online (Sandbox Code Playgroud)

python pathlib

3
推荐指数
1
解决办法
3659
查看次数

如何为 Python pathlib.Path 加上另一个路径的前缀?

我有一个pathlib.Path('/etc')。如果我需要为其添加前缀pathlib.Path('/mnt/chroot')并执行以下操作:

Path('/mnt/chroot') / Path('/etc')

我最终得到: PosixPath('/etc'),大概是因为两者Path都是绝对路径,并且不能连接。

我可以用类似的方法来组合解决方案:

Path('/mnt/chroot') / str(Path('/etc')).removeprefix('/')

但这是冗长、粗俗的。有没有更简单、正确的方法来做到这一点?

python python-3.x pathlib

3
推荐指数
1
解决办法
1579
查看次数

Pathlib 中“joinpath”和“/”的区别

模块中的joinpath和运算符有区别吗?该文档从未比较这两种方法。从本质上讲,这两者是否存在不同的情况?/pathlib

例子:


from pathlib import Path

foo = Path("some_path")
foo_bar_operator = foo / "bar"
foo_bar_joinpath = foo.joinpath("bar")

foo_bar_operator == foo_bar_joinpath
# Returns: True

Run Code Online (Sandbox Code Playgroud)

python-3.x pathlib

3
推荐指数
1
解决办法
3688
查看次数

如何在python中控制迭代器的结果顺序

我使用pathlib.Path()。iterdir()来获取路径的子字典。在“ / home / yuanyi / workspace / app”下,有4个位置:“ 01”,“ 02”,“ 03”,“ 04”。

from pathlib import Path
for subdir in Path('/home/yuanyi/workspace/app').iterdir():
    print(subdir)
Run Code Online (Sandbox Code Playgroud)

但是结果没有顺序。

/home/yuanyi/workspace/app/02
/home/yuanyi/workspace/app/03
/home/yuanyi/workspace/app/01
/home/yuanyi/workspace/app/00
Run Code Online (Sandbox Code Playgroud)

结果不是以下内容:

/home/yuanyi/workspace/app/01
/home/yuanyi/workspace/app/02
/home/yuanyi/workspace/app/03
/home/yuanyi/workspace/app/04
Run Code Online (Sandbox Code Playgroud)

我想知道迭代器的工作原理,以及获得有序结果的最佳方法是什么。

python iterator pathlib

2
推荐指数
1
解决办法
1943
查看次数

使用pathlib获取符号链接的目标

有没有办法获得符号链接的目标pathlib?我知道这可以用来完成os.readlink().

我想创建一个由链接及其目标文件组成的字典.

links = [link for link in root.rglob('*') if link.is_symlink()]
files = [Path(os.readlink(str(pointed_file))) for pointed_file in links]
Run Code Online (Sandbox Code Playgroud)

编辑 ...我想过滤所有不是绝对的路径

    link_table = {link : pointed_file for link, pointed_file in zip(links, files) if pointed_file.is_absolute()}
Run Code Online (Sandbox Code Playgroud)

python symlink python-3.x pathlib

2
推荐指数
1
解决办法
1182
查看次数

Pathlib 使用 Path.parents 访问 Path 时出错

为什么当我在 Python IDE (PyCharm) 中运行以下代码片段时:

import os
from pathlib import Path

if os.path.isfile('shouldfail.txt'):
    p = Path(__file__).parents[0]
    p2 = Path(__file__).parents[2]
    path_1 = str(p)
    path_2 = str(p2)

    List = open(path_1 + r"/shouldfail.txt").readlines()
    List2 = open(path_2 + r"/postassembly/target/generatedShouldfail.txt").readlines()
Run Code Online (Sandbox Code Playgroud)

它工作正常并返回所需的结果,但是当我通过命令行运行脚本时,出现错误:

File "Script.py", line 6, in <module>
    p2 = Path(__file__).parents[2]
  File "C:\Users\Bob\AppData\Local\Programs\Python\Python36\lib\pathlib.py", line 594, in __getitem__
    raise IndexError(idx)
IndexError: 2
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?还有一种更好/更简单的方法可以从我运行脚本的当前路径向上移动两个文件夹(在脚本内)?

python pycharm python-3.x pathlib index-error

2
推荐指数
1
解决办法
2178
查看次数

在python中找到当前文件目录的最好方法

我正在寻找替代品

import os
package_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(package_dir,'foo.csv')
Run Code Online (Sandbox Code Playgroud)

我的工作路径不是文件的路径。所以当我想加载一个文件时,我需要一种方法来生成与我的工作目录相比的相对路径。

我想更新到 pathlib(或其他任何东西)。但最好的方法是什么?

我找到了/sf/answers/3093194261/,但我不认为这个解决方案比我目前的方式更好。

评论:

它不是如何正确确定当前脚本目录的副本,因为我明确询问了最好的方式。另一篇文章中的大多数解决方案看起来不太好,或者在我的问题中已经提到。解决方案

Path(__file__).with_name("foo.csv")
Run Code Online (Sandbox Code Playgroud)

这里给出的解决方案比另一个问题中给出的解决方案要好得多,因为它很容易理解,并且是一种真正的 Pythonic 解决方法。如果这个问题是重复的,那么在另一篇文章中也会有一个同样好的答案。

python pathlib

2
推荐指数
1
解决办法
1272
查看次数

如何使用 pathlib 删除目录树?

我有一个项目正在使用pathlib,我想做相当于shutil.rmtree.

我想用类似的方法来做:

def pathlib_rmtree(folder):
    if folder.exists():
        for file in folder.glob('**/*'):
            if file.is_dir():
                file.rmdir()
            else:
                file.unlink()
        folder.rmdir()
Run Code Online (Sandbox Code Playgroud)

但我不确定是否folder.glob('**/*')保证订购 ,以便在调用之前所有子文件夹都是空的rmdir

所以问题是双重的:

  1. 有没有更好的方法来递归删除目录pathlib
  2. 是否glob保证其结果的顺序,以便所有文件在它们所属的子文件夹之前返回?

directory python-3.x pathlib

2
推荐指数
1
解决办法
1505
查看次数

Path.replace 是否等同于 os.replace 或 shutil.move?

pathlib.Path.replace方法的文档指出:

将此文件或目录重命名为给定的目标。如果目标指向现有文件或目录,它将被无条件替换。

这缺少一些细节。为了进行比较,这里是 的文档os.replace

将文件或目录重命名srcdst. 如果dst是目录, OSError将被引发。如果dst存在并且是一个文件,如果用户有权限,它将被静默替换。如果srcdst位于不同的文件系统上,操作可能会失败。如果成功,重命名将是一个原子操作(这是 POSIX 要求)。

最重要的部分是“操作可能会失败,如果srcdst在不同的文件系统”。不像os.replaceshutil.move没有这个问题:

如果目标在当前文件系统上,则os.rename()使用。否则,src复制到dst使用copy_function然后删除。

那么,这些函数中的哪一个正在Path.replace使用?Path.replace由于目标位于不同的文件系统上,是否有失败的风险?

python file-rename pathlib

2
推荐指数
1
解决办法
1384
查看次数