新的ish^{} module(在Python>;=3.4中提供)非常适合处理类似路径的对象(包括Windows和其他os)。
简化:您可以将任何路径(目录和文件路径对象被视为完全相同的)构建为一个对象,它可以是一个绝对路径对象或一个相对路径对象。您可以使用原始字符串生成复杂的路径(即r'string'),并且pathlib将是非常宽容的。但是,请注意,与原始字符串相比,有更好的方法来构建路径(请参阅下一步)。
下面是一些例子:from pathlib import Path
Path(r'c:\temp\foo.bar') # absolute path
Path(r'c:/temp/foo.bar') # same absolute path
Path('foo.bar') # different path, RELATIVE to current directory
Path('foo.bar').resolve() # resolve converts to absolute path
Path('foo.bar').exists() # check to see if path exists
请注意,如果您使用的是Windows pathlib,请原谅您在第二个示例中使用了“错误的斜杠”。请参阅最后的讨论,了解为什么您可能应该始终使用正斜杠。
简单地显示一些有用的路径(如当前工作目录和用户主页)的工作方式如下:# Current directory (relative):
cwd = Path() # or Path('.')
print(cwd)
# Current directory (absolute):
cwd = Path.cwd()
print(cwd)
# User home directory:
home = Path.home()
print(home)
# Something inside the current directory
file_path = Path('some_file.txt') # relative path; or
file_path = Path()/'some_file.txt' # also relative path
file_path = Path().resolve()/Path('some_file.txt') # absolute path
print(file_path)
要在文件树中导航,可以执行以下操作。注意,第一个对象home是一个Path,其余的只是字符串:some_person = home/'Documents'/'Project Documentation'/'personica.txt' # or
some_person = home.join('Documents','Project Documentation','personica.txt')
要读取位于路径上的文件,可以使用其open方法而不是open函数:with some_person.open() as f:
dostuff(f)
但你也可以直接抓取文本!contents = some_person.read_text()
content_lines = contents.split('\n')
…直接写文本!data = '\n'.join(content_lines)
some_person.write_text(data) # overwrites existing file
以这种方式检查它是一个文件还是一个目录(并且存在):some_person.is_dir()
some_person.is_file()
创建一个新的空文件,而不这样打开它(以静默方式替换任何现有文件):some_person.touch()
要使文件仅在不存在时才存在,请使用exist_ok=False:try:
some_person.touch(exist_ok=False)
except FileExistsError:
# file exists
创建一个新目录(在当前目录下,Path()),如下所示:Path().mkdir('new/dir') # get errors if Path()/`new` doesn't exist
Path().mkdir('new/dir', parents=True) # will make Path()/`new` if it doesn't exist
Path().mkdir('new/dir', exist_ok=True) # errors ignored if `dir` already exists
以这种方式获取路径的文件扩展名或文件名:some_person.suffix # empty string if no extension
some_person.stem # note: works on directories too
对路径的最后一部分使用name(如果存在,则使用茎和延伸部分):some_person.name # note: works on directories too
使用with_name方法重命名文件(该方法返回相同的路径对象,但具有新的文件名):new_person = some_person.with_name('personica_new.txt')
您可以使用iterdir遍历目录中的所有“stuff”:all_the_things = list(Path().iterdir()) # returns a list of Path objects
侧边栏:反斜杠(\)
在路径字符串中使用反斜杠时要小心,特别是以反斜杠结尾的路径。与any字符串一样,即使在原始输入模式下,Python也会将终止反斜杠作为转义字符读取。注意:>>> r'\'
File "", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
因此,如果您不知道这个问题,这将给出一个相当隐晦的错误消息:>>> Path(r'C:\')
File "", line 1
Path(r'\')
^
SyntaxError: EOL while scanning string literal
这个错误的原因是\'被假定为字符串中的单引号。这很好:'\''(第二个单引号结束字符串)。
如果坚持使用反斜杠,请确保使用原始输入模式,否则会遇到问题。例如,'\t'字符表示一个制表符。所以当你这样做时(没有原始输入):>>> Path('C:\temp')
您正在将制表符放入您的路径中。这是完全合法的,Python不会抱怨,除非您做了一些事情,使Windows尝试将其转换为一个真正的Windows路径:>>> Path('C:\temp').resolve()
Traceback (most recent call last):
File "", line 1, in
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\temp'
如果你不知道发生了什么,这也是一个非常神秘的错误!在处理路径时最好避免使用反斜杠字符。
防止你的问题
创建文件并错误地添加了双扩展名时出现问题。要使用pathlib防止此问题,请使用touch方法生成文件:some_person = Path.home()/'Documents'/'Project Documentation'/'personica.txt'
some_person.touch()