我使用pathlib递归匹配所有文件以根据文件内容过滤文件。然后我想找到这个文件的文件夹的顶层是什么。假设如下。我在文件夹中有一个文件:
a/b/c/file.log
我从级别进行搜索a:
for f in path_data.glob("**/*"):
if something inside file f:
# I would like to get in what folder this file is, i.e. 'b'
Run Code Online (Sandbox Code Playgroud)
我现在可以使用以下方法获得所有父母级别:
f.parents 会给我 b/cf.parent 会给我 cf.name 会给我 file.log但我怎么能得到b呢?
准确地说:存储文件的级别数未知。
UPD:我知道我可以用 split 来做到这一点,但我想知道是否有合适的 API 来做到这一点。我找不到。
来自 Python 3.4的pathlib 库中的新 Path 包似乎是诸如 等方法的强大替代品os.path.join(),但我在使用它时遇到了一些麻烦。
我有一条路径可以是从folder_foo/file.csv到的任何内容long/path/to/folder_foo/file.csv。我folder_foo用 Pandas读取了 .csv 文件,修改了它并想将它保存到folder_bar/file.csv或long/path/to/folder_bar/file.csv。
基本上我想在 Path 对象中重命名folder_foo为folder_bar。
编辑:示例路径代码
csv_path = Path("long/path/to/folder_foo/file.csv")
Run Code Online (Sandbox Code Playgroud)
csv_path.parents[0] = csv_path.parents[0] + "_clean")
Run Code Online (Sandbox Code Playgroud)
这会导致错误TypeError: unsupported operand type(s) for +: 'PosixPath' and 'str',这意味着您不能+将 aPosixPath与 a结合使用str,如TypeError: unsupported operand type(s) for +: 'PosixPath' 和 'str' 中所述。
为了解决这个问题,我尝试了以下方法:
csv_path.parents[0] = Path(str(csv_path.parents[0]) + "_clean") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 win 环境变量来%userprofile%\desktop保护pathlib不同用户 PC 中的文件。
但我无法让它工作,它一直保存在运行脚本目录中。
导入路径库
从日期时间导入日期时间
a = r'%userprofile%\desktop\test2'
b = 'test'
def path(path_name, f_name):
date = datetime.now().strftime("%d%m-%H%M%S")
file_name = f'{f_name}--{date}.xlsx'
file_path = pathlib.Path(path_name).joinpath(file_name)
file_dir = pathlib.Path(path_name)
try:
file_dir.mkdir(parents=True, exist_ok=True)
except OSError as err:
print(f"Can't create {file_dir}: {err}")
return file_path
path(a, b)
Run Code Online (Sandbox Code Playgroud) 我试图循环遍历目录中的所有 html 文件,但收到此错误:
NotImplementedError: Non-relative patterns are unsupported
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码是:
from bs4 import BeautifulSoup
import argparse
from pathlib import Path
parser = argparse.ArgumentParser(description = ("Script to scrape data from antismash html output"))
parser.add_argument("-p", "--path", help = "give path/to/directory containing antismash outputs", required = True)
args = parser.parse_args()
for file in Path(args.path).glob("/*.html"):
def scraper(filename):
soup = BeautifulSoup(open(filename), 'html.parser')
soup.findAll('a') > os.path.basename(filename).txt
Run Code Online (Sandbox Code Playgroud)
我以前使用过相同的方法,但没有收到错误,所以我不确定发生了什么。
会Path('.').glob('*.ext')产生一致的结果排序(假设被通配的文件不会改变)?
似乎全局排序基于文件系统顺序(至少对于旧glob包而言)。是否会通过将文件添加到目录(不会包含在 glob 中)来更改pathlib的glob顺序?即使没有向特定目录添加任何内容(例如,当系统上的其他地方进行其他大文件更改时),文件系统是否会更改此顺序?在几天的过程中?或者在所有这些情况下排序会保持一致吗?
只是为了澄清,我不能简单地转换为列表并排序,因为有太多的文件路径无法同时放入内存。我希望每次都能达到相同的顺序,因为我将进行一些 ML 培训,并希望将每个第 n 个文件留作验证数据。此培训将需要几天时间,这就是为什么我很想知道订单在文件系统上是否长时间保持稳定。
假设我有一个未知长度的列表。如何使用 pathlib 将此列表的所有元素加入到我当前的路径中?
from pathlib import Path
Path.joinpath(Path(os.getcwd()).parents[1] , *["preprocessing", "raw data"])
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为该函数需要字符串而不是元组。
我喜欢这个pathlib.Pathapi,并且经常将它用于快速 cli 工具。尤其是打字机。我有几个紧密相关的问题:
-是 stdin 的事实上的标准。Windows下也是这样吗?pathlib.Path对象(或者实际上是它自动变成的 {POSIX,Windows}Path)来表示 stdin?我正在尝试构建一个 Python 包,但出现以下错误。
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (setuptools >= 40.8.0, wheel)
* Getting dependencies for sdist...
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/pep517/in_process/_in_process.py", line 351, in <module>
main()
File "/usr/local/lib/python3.10/site-packages/pep517/in_process/_in_process.py", line 333, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/usr/local/lib/python3.10/site-packages/pep517/in_process/_in_process.py", line 285, in get_requires_for_build_sdist
return hook(config_settings)
File "/tmp/build-env-eyqolcf7/lib/python3.10/site-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_sdist
return self._get_build_requires(config_settings, requirements=[])
File "/tmp/build-env-eyqolcf7/lib/python3.10/site-packages/setuptools/build_meta.py", line 320, in _get_build_requires
self.run_setup()
File "/tmp/build-env-eyqolcf7/lib/python3.10/site-packages/setuptools/build_meta.py", line 482, in run_setup
super(_BuildMetaLegacyBackend,
File "/tmp/build-env-eyqolcf7/lib/python3.10/site-packages/setuptools/build_meta.py", line 335, in …Run Code Online (Sandbox Code Playgroud) 我想构建一些功能来在s3和本地文件系统之间移动文件,但是pathlib似乎吃掉了很多重复的斜杠,从而破坏了我的aws-cli功能:
from pathlib import Path
p = Path('s3://loc')
str(p)
=> 's3:/loc'
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用pathlib来处理s3路径?
如果我给一个字符串的路径,例如"〜/ pythoncode/*.py",那么将它全局化的最佳方法是什么pathlib?
使用pathlib,有一种方法可以使用glob追加到路径:
p = pathlib.Path('~/pythoncode/').expanduser().glob('*.py')
Run Code Online (Sandbox Code Playgroud)
但是,例如,这不起作用,因为用户未展开:
p = pathlib.Path().glob('~/pythoncode/*.py')
Run Code Online (Sandbox Code Playgroud)
这会产生一个异常,因为我没有提供任何参数glob():
p = pathlib.Path('~/pythoncode/*.py').expanduser().glob()
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点pathlib,或者我必须先解析字符串?