当我需要在脚本中定义文件系统路径时,我用来os.path.join
保证该路径在不同文件系统上保持一致:
from os import path
path_1 = path.join("home", "test", "test.txt")
Run Code Online (Sandbox Code Playgroud)
我也知道有一个Pathlib
库基本上做同样的事情:
from pathlib import Path
path_2 = Path("home") / "test" / "test.txt"
Run Code Online (Sandbox Code Playgroud)
这两种处理路径的方法有什么区别?哪一个更好?
我尝试复制一个文件 pathlib
import pathlib
import shutil
my_file=pathlib.Path('/etc/hosts')
to_file=pathlib.Path('/tmp/foo')
shutil.copy(my_file, to_file)
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
/home/foo_egs_d/bin/python /home/foo_egs_d/src/test-pathlib-copy.py
Traceback (most recent call last):
File "/home/foo_egs_d/src/test-pathlib-copy.py", line 6, in <module>
shutil.copy(my_file, to_file)
File "/usr/lib/python2.7/shutil.py", line 117, in copy
if os.path.isdir(dst):
File "/home/foo_egs_d/lib/python2.7/genericpath.py", line 41, in isdir
st = os.stat(s)
TypeError: coercing to Unicode: need string or buffer, PosixPath found
Process finished with exit code
Run Code Online (Sandbox Code Playgroud)
...如何在Python 2.7中使用pathlib复制文件?
我正在使用Python 3的pathlib
模块,如下所示:
from pathlib import Path
filename = Path(__file__).parent / "example.txt"
contents = open(filename, "r").read()
Run Code Online (Sandbox Code Playgroud)
但我在某些机器上遇到此错误:
TypeError: invalid file: PosixPath('example.txt')
Run Code Online (Sandbox Code Playgroud)
但是在我的机器上它可以工作.
是否有类似的东西os.path.dirname(path)
,但在pathlib?
从stat()
调用检索到的修改时间转换为datetime
对象的最惯用/最有效的方法是什么?我想出了以下(python3):
from datetime import datetime, timedelta, timezone
from pathlib import Path
path = Path('foo')
path.touch()
statResult = path.stat()
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
modified = epoch + timedelta(seconds=statResult.st_mtime)
print('modified', modified)
Run Code Online (Sandbox Code Playgroud)
似乎围绕一个回合,有点令人惊讶,我必须在那里硬编码Unix时代.有更直接的方式吗?
使用以下pathlib
模块创建路径对象:
p = pathlib.Path('file.txt')
Run Code Online (Sandbox Code Playgroud)
该p
对象将指向文件系统中的某个文件,因为我可以这样做p.read_text()
.
如何p
在字符串中获取对象的绝对路径?
似乎我可以使用例如os.path.abspath(p)
获取绝对路径,但使用os.path
方法很难,因为我认为pathlib
应该替代os.path
.
我目前正在使用Pathlib
如下方式访问我的文件的父目录:
Path(__file__).parent
Run Code Online (Sandbox Code Playgroud)
当我打印它时,这给了我以下输出:
print('Parent: ', Path(__file__).parent)
#output
/home/user/EC/main-folder
Run Code Online (Sandbox Code Playgroud)
该main-folder
有一个.env
,我想访问文件和我想加入与父路径.env
。现在,我做到了:
dotenv_path = os.path.join(Path(__file__).parent, ".env")
Run Code Online (Sandbox Code Playgroud)
哪个有效。但我想知道,是否有Pathlib
替代方案os.path.join()
?就像是:
dotenv_path = pathlib_alternate_for_join(Path(__file__).parent, ".env")
Run Code Online (Sandbox Code Playgroud) 我正在转换一些旧的Python代码pathlib
而不是os.path
用于大多数与路径相关的操作,但我最终遇到了以下问题:我需要向已经有扩展的路径添加另一个扩展(而不是替换它).有了os.path
,因为我们仅仅处理字符串,该解决方案是与字符串操作添加扩展:
newpath = path + '.res'
Run Code Online (Sandbox Code Playgroud)
它不起作用,pathlib.Path
因为它不允许连接任意字符.我能找到的最接近的是:
newpath = path.with_suffix(path.suffix + '.res')
Run Code Online (Sandbox Code Playgroud)
它看起来像一个变通方法,因为它最终仍然使用字符串添加.它有一个新的陷阱,因为我首先忘记了已经有几个扩展并且你想要添加一个新扩展的情况,导致以下代码恢复旧的行为:
newpath = path.with_suffix(''.join(path.suffixes) + '.res')
Run Code Online (Sandbox Code Playgroud)
现在它不会感到简洁和干净,因为它使用越来越多的字符串操作来实现旧行为而不是纯路径操作.Path.suffixes
存在的事实意味着库的开发人员考虑了文件可以有多个扩展的情况,但我找不到简单地向路径添加新扩展的方法.我是否有更多惯用的方式来实现相同的行为?
编辑:实际上path.with_suffix(path.suffix + '.res')
足以处理已经有几个文件扩展名的情况,即使它对我来说并不是很明显.
如何使用pathlib以递归方式迭代给定目录的所有子目录?
p = Path('docs')
for child in p.iterdir(): child
Run Code Online (Sandbox Code Playgroud)
似乎只是迭代给定目录的直接子节点.
我知道这是可能的os.walk()
或glob
,但我想使用pathlib因为我喜欢使用路径对象.
我正在使用 Windows 10 和 winpython。我有一个扩展名为 .dwt 的文件(它是一个文本文件)。我想将此文件的扩展名更改为 .txt。
我的代码不会抛出任何错误,但不会更改扩展名。
from pathlib import Path
filename = Path("E:\\seaborn_plot\\x.dwt")
print(filename)
filename_replace_ext = filename.with_suffix('.txt')
print(filename_replace_ext)
Run Code Online (Sandbox Code Playgroud)
在winpython的ipython窗口输出中打印出预期的结果(如下图):
E:\seaborn_plot\x.dwt
E:\seaborn_plot\x.txt
但是当我寻找一个扩展名重命名的文件时,扩展名没有改变,只有原始文件存在。我怀疑 Windows 文件权限。