我正在尝试与外部 Linux 服务器一起使用pysftp,但是当我尝试使用os.path.join()或 来连接路径和文件名时pathlib.Path(),可以理解它们默认为本地(Windows)路径分隔符\\。'/'.join()可以解决问题,但感觉不是正确的答案,但可能是最好的解决方案。
import os
from pathlib import Path, PosixPath
os.path.join('path', 'to', 'file.txt')
# path\to\file.txt -- Windows
Path('path') / 'to' / 'file.txt'
# path\to\file.txt -- Windows
'/'.join(('path', 'to', 'file.txt'))
# path/to/file.txt -- Posix
Run Code Online (Sandbox Code Playgroud)
通常,我会path/to从当前工作目录中获取pysftp,因此将其输入而不是手动构建整个路径字符串,该'/'.join()方法仍然是唯一有效的方法。
os.path.join('path/to', 'file.txt')
# path/to\file.txt -- Mixed
Path('path/to') / 'file.txt'
# path\to\file.txt -- Windows
'/'.join(('path/to', 'file.txt'))
# path/to/file.txt -- Posix
Run Code Online (Sandbox Code Playgroud)
当我在 Windows 上运行时,有没有办法强制os.path.join()或pathlib.Path使用 Posix 分隔符?我尝试设置sep …
我想修补对象的exists()方法pathlib.Path以进行单元测试,但是我无法使它起作用。
我想做的是这样的:
from unittest.mock import patch
from pathlib import Path
def test_move_basic():
p = Path('~/test.py')
with patch.object(p, 'exists') as mock_exists:
mock_exists.return_value = True
Run Code Online (Sandbox Code Playgroud)
但是它失败了:
AttributeError: 'PosixPath' object attribute 'exists' is read-only。
有任何想法吗?
我的机器中有以下预先存在的文件夹
D:\scripts\myfolder
Run Code Online (Sandbox Code Playgroud)
我希望我的脚本创建一个名为 的文件夹并在其中logs创建一个文件。log.txt所以路径看起来像
D:\scripts\myfolder\logs\somelog.txt
Run Code Online (Sandbox Code Playgroud)
所以我用了
p = pathlib.Path("D:\scripts\myfolder\logs\somelog.txt")
p.mkdir(parents=True, exisit_ok=True)
Run Code Online (Sandbox Code Playgroud)
现在
print(p.parents[0])==>D:\scripts\myfolder\logs
print(p.parents[1])==>D:\scripts\myfolder
print(p.parents[2])==>D:\scripts
因此,根据Path.mkdir文档
p.mkdir(parents=True, exisit_ok=True)应该创建文件夹logs,myfolder或者scripts等等(如果它们不存在)。
some.txt但它会按inside文件夹的名称创建一个文件夹logs,尽管它不是parents. 为什么会这样?
我知道解决方法是使用pathlib.Path("D:\scripts\myfolder\logs")
我的文件结构如下所示:
我正在尝试计算整个 Outer 文件夹中的文件总数。当我将 os.walk 传递给 Outer 文件夹时,它不会返回任何文件,因为我只有两层,所以我手动编写了它:
total = 0
folders = ([name for name in os.listdir(Outer_folder)
if os.path.isdir(os.path.join(Outer_folder, name))])
for folder in folders:
contents = os.listdir(os.path.join(Outer_folder, folder))
total += len(contents)
print(total)
Run Code Online (Sandbox Code Playgroud)
有更好的方法来做到这一点吗?我可以在任意嵌套的文件夹集中找到文件数吗?我在 stackoverflow 上看不到任何深度嵌套文件夹的示例。
(“更好”我的意思只是某种内置函数,而不是手动编写一些东西来迭代 - 例如一个 os.walk 走整棵树)
我想用 pathlib 递归搜索所有文件夹中的所有文件,但我想排除以“.”开头的隐藏系统文件 (如'.DS_Store')但我在pathlib中找不到像startswith这样的函数。如何在pathlib中实现startswith?我知道如何使用 os.
def recursive_file_count(scan_path):
root_directory = Path(scan_path)
fcount = len([f for f in root_directory.glob('**/*') if f.startswith(".")])
print(fcount)
Run Code Online (Sandbox Code Playgroud) 我在导入“pathlib”的环境中遇到奇怪的问题,它说在终端中执行以下命令后未定义路径。
>>> import pathlib
>>> Path.cwd()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Path' is not defined
Run Code Online (Sandbox Code Playgroud)
谢谢
Path我可以跑步,path.is_dir()我怎样才能做同样的事情PosixPath呢?
我正在尝试使用Shutil使用来自Pathlib的路径对象复制pdf文件,但是当我运行代码时,使用str()将路径转换回字符串时出现错误“ str对象不可调用”。为什么会发生这种情况的任何解释将非常有帮助。谢谢!
from pathlib import Path
from wand.image import Image as wandImage
import shutil
import sys
import os
def pdf2Jpeg(pdf_path):
pdf = pdf_path
jpg = pdf[:-3] + "jpg"
img = wandImage(filename=pdf)
img.save(filename=jpg)
src0 = Path(r"G:\Well Schematics\Well Histories\Merged")
dst0 = Path(r"G:\Well Schematics\Well Histories\Out")
if not dst0.exists():
dst0.mkdir()
pdfs = []
api = ''
name = ''
pnum = ''
imgs = []
for pdf in src0.iterdir():
pdfs.append(pdf)
for pdf in pdfs:
if not dst0.exists():
dst0.mkdir()
str = str(pdf.stem)
split = str.split('_') …Run Code Online (Sandbox Code Playgroud) pathlib.Path.cwd() 返回不同的值,具体取决于我使用的计算机(两台 Windows PC - 一台在工作,一台在家里)。
项目结构(参见https://github.com/jonathanchukinas/file_read_exercise.git)
main.py 和 read_excel_file.py 都包含:
from pathlib import Path
print(Path.cwd())
在工作中,每个 python 文件返回顶级目录的绝对路径。在家里,每个 python 文件都会返回其自己目录的绝对路径。
我已经阅读了文档,并且用谷歌搜索并搜索了堆栈溢出,但找不到这个问题的答案:
cwd() 如何工作以便我可以更好地预测其结果?
我正在与一位同事讨论是否有一种内置(或干净)的方法来使用 Pathlib 遍历任意路径来查找给定的父文件夹,例如存储库的根目录(每个用户的根目录可能有所不同)所述存储库的本地副本)。我模拟了以下所需的行为:
from pathlib import Path
def find_parent(path: Path, target_parent: str) -> Path:
for part in path.parts[::-1]:
if part != target_parent:
path = path.parent
else:
break
return path
path = Path("/some/arbitrarily/long/path/ROOT_FOLDER/subfolder1/subfolder2/file.py")
root = find_parent(path, "ROOT_FOLDER")
assert root == Path("/some/arbitrarily/long/path/ROOT_FOLDER")
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来实现这一目标?
我将一些代码从 移至os.path,pathlib.Path发现总的来说它要好得多。
在一项特定任务中,我发现实际上os.path使用起来可能更舒服。我想通过在其名称中添加后缀并保持相同的根和扩展名来从给定路径创建一条新路径。例如,来自:
/a/b/c/file.txt
Run Code Online (Sandbox Code Playgroud)
我想得到:
/a/b/c/file_test.txt
Run Code Online (Sandbox Code Playgroud)
使用os.path,可以通过以下方式轻松完成splitext:
/a/b/c/file.txt
Run Code Online (Sandbox Code Playgroud)
但是,浏览了 的pathlib文档,我发现with_name并with_suffix得到了类似的内容:
/a/b/c/file_test.txt
Run Code Online (Sandbox Code Playgroud)
我相信这比版本差得多os.path。
有没有更好、更干净的方法来实现这一点pathlib?