我有一个文件的数据路径,其中有几个数据文件,例如 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元素似乎很愚蠢。有没有直接的方法从目录列表中排除?
作为代码的一部分,我的功能如下:
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) 我有一个pathlib.Path('/etc')。如果我需要为其添加前缀pathlib.Path('/mnt/chroot')并执行以下操作:
Path('/mnt/chroot') / Path('/etc')
我最终得到: PosixPath('/etc'),大概是因为两者Path都是绝对路径,并且不能连接。
我可以用类似的方法来组合解决方案:
Path('/mnt/chroot') / str(Path('/etc')).removeprefix('/')
但这是冗长、粗俗的。有没有更简单、正确的方法来做到这一点?
模块中的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) 我使用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)
我想知道迭代器的工作原理,以及获得有序结果的最佳方法是什么。
有没有办法获得符号链接的目标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 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)
我在这里缺少什么?还有一种更好/更简单的方法可以从我运行脚本的当前路径向上移动两个文件夹(在脚本内)?
我正在寻找替代品
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 解决方法。如果这个问题是重复的,那么在另一篇文章中也会有一个同样好的答案。
我有一个项目正在使用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。
所以问题是双重的:
pathlib?glob保证其结果的顺序,以便所有文件在它们所属的子文件夹之前返回?该pathlib.Path.replace方法的文档指出:
将此文件或目录重命名为给定的目标。如果目标指向现有文件或目录,它将被无条件替换。
这缺少一些细节。为了进行比较,这里是 的文档os.replace:
将文件或目录重命名
src为dst. 如果dst是目录,OSError将被引发。如果dst存在并且是一个文件,如果用户有权限,它将被静默替换。如果src和dst位于不同的文件系统上,操作可能会失败。如果成功,重命名将是一个原子操作(这是 POSIX 要求)。
最重要的部分是“操作可能会失败,如果src和dst在不同的文件系统”。不像os.replace,shutil.move没有这个问题:
如果目标在当前文件系统上,则
os.rename()使用。否则,src复制到dst使用copy_function然后删除。
那么,这些函数中的哪一个正在Path.replace使用?Path.replace由于目标位于不同的文件系统上,是否有失败的风险?
pathlib ×10
python ×8
python-3.x ×5
directory ×1
file-rename ×1
index-error ×1
iterator ×1
pycharm ×1
symlink ×1