预期的投入和产出:
a -> a
a.txt -> a
archive.tar.gz -> archive
directory/file -> file
d.x.y.z/f.a.b.c -> f
logs/date.log.txt -> date # Mine!
Run Code Online (Sandbox Code Playgroud)
这是我对我感到肮脏的实现:
>>> from pathlib import Path
>>> example_path = Path("August 08 2015, 01'37'30.log.txt")
>>> example_path.stem
"August 08 2015, 01'37'30.log"
>>> example_path.suffixes
['.log', '.txt']
>>> suffixes_length = sum(map(len, example_path.suffixes))
>>> true_stem = example_path.name[:-suffixes_length]
>>> true_stem
"August 08 2015, 01'37'30"
Run Code Online (Sandbox Code Playgroud)
因为它在Path没有后缀的情况下中断:
>>> ns_path = Path("no_suffix")
>>> sl = sum(map(len, ns_path.suffixes))
>>> ns_path.name[:-sl]
''
Run Code Online (Sandbox Code Playgroud)
所以我需要先检查Path后缀是否有后缀:
>>> def get_true_stem(path: …Run Code Online (Sandbox Code Playgroud) 我正在用 Python3 编写一些软件,旨在备份 Windows 客户端上的目录结构,并将其发送到 Linux 服务器。
我遇到的问题是如何处理 Windows 和 Linux 文件路径。我需要 Windows 客户端创建一个表示源文件的相对路径的对象,将该相对路径发送到服务器,以便服务器知道将文件写入目标文件夹中的哪个子目录,然后发送实际数据。
发送实际数据不是问题,但是如何发送 Windows 相对路径到 Linux 系统?我尝试将其作为字符串使用os.path,但很快就变得一团糟。我正在考虑使用pathlib.
如果我可以创建某种路径对象,我可以使用 pickle 来序列化它,并将其发送到服务器。我将使用 pathlib 中的什么对象来表示路径?
Path()似乎创建了一个适用于当前文件系统(PosixPath或WindowsPath)的类的实例,这些文件系统不可移植。如果我WindowsPath在 Windows 客户端上创建一个对象,Linux 将无法反序列化它,因为您甚至无法WindowsPath在 Linux 系统上实例化一个对象。
看起来我可以使用一个PureWindowsPath对象,然后将其发送到 Linux,但是如何将PureWindowsPath对象(表示相对路径)转换为 aPosixPath或至少 a PurePosixPath?
那可能吗?还是我想的全错了?
我想替换file_location = os.path.abspath(os.path.dirname(__file__))
为pathlib来获取没有文件名的文件的绝对路径
使用 using directorypath = pathlib.Path(__file__).resolve()
给我绝对路径+文件名
我怎样才能获得没有文件名的绝对路径?
我已经开始使用了pathlib.Path一段时间,我喜欢使用它.现在我已经习惯了,我已经变得草率,忘记了参与str.
此使用时经常发生tox+ py.test基于临时目录tmpdir(这是一个py._path.local.LocalPath):
from pathlib import Path
import pytest
def test_tmpdir(tmpdir):
p = Path(tmpdir) / 'testfile.csv'
Run Code Online (Sandbox Code Playgroud)
我不是str()每次都插入,而是更普遍地解决这个问题,但不能.
首先,我尝试使自己的Path类具有适应性_parse_args:
import pytest
from py._path.local import LocalPath
from pathlib import Path, PurePath
def Path(Path):
@classmethod
def _parse_args(cls, args):
parts = []
for a in args:
if isinstance(a, PurePath):
parts += a._parts
elif isinstance(a, str):
# Force-cast str subclasses to str (issue #21127)
parts.append(str(a))
elif isinstance(a, LocalPath):
parts.append(str(a))
else: …Run Code Online (Sandbox Code Playgroud) 我使用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)
这不起作用,因为该函数需要字符串而不是元组。