在Python中获取/设置逻辑目录路径的方法有以下几种:
os.path.dirname()
和os.path.basename()
函数获取目录和文件名:import os
def get_logical_path(path):
logical_path = os.path.dirname(os.path.basename(path))
return logical_path
def set_logical_path(path, logical_path):
os.path.basename(path) = logical_path
将逻辑目录存储在变量logical_path
中,并在获取和设置目录时对其进行引用。
os.walk()
函数遍历目录并获取目录和文件名:import os
def get_logical_path(path):
logical_path = ""
for root, dirs, files in os.walk(path):
for file_name in files:
logical_path = os.path.join(root, file_name)
break
return logical_path
def set_logical_path(path, logical_path):
os.path.join(path, logical_path) = os.path.dirname(logical_path)
这个方法类似于使用os.path.dirname()
函数,但是它使用os.walk()
函数更复杂,适用于较复杂的情况。
import os
class FolderPathLexer:
def __init__(self, path):
self.path = path
self.tokens = []
self.pos = 0
def advance(self):
if self.pos >= len(self.path):
self.tokens.append(None)
return
if self.path[self.pos] == '/':
if self.path.endswith('/'):
self.tokens.append('/')
else:
self.tokens.append('')
self.pos += 1
else:
if self.path.endswith('/'):
self.pos += 1
else:
self.pos += 1
def match(self):
current_token, self.pos = self.path[self.pos], self.pos + 1
if current_token is None:
self.tokens.append(None)
return
self.tokens.append(current_token)
if current_token in ['.', './']:
if self.path.endswith('/..'):
self.tokens.append('')
else:
self.pos = current_token + 1
elif current_token == []:
pass
elif current_token == ['..']:
self.pos = current_token + 1
elif current_token in ['/', '\']):
if self.path.endswith('/'):
self.tokens.append('')
else:
self.tokens.append('')
self.pos += 1
elif current_token in ['/', '/..']:
if self.path.endswith('/.'):
self.tokens.append('')
else:
self.pos += 1
else:
raise ValueError("Invalid FolderPathLexer token: ".format(current_token))
上面的代码实现了一个自定义解析器,该解析器可以使用在代码中使用一个字符串路径来构建一个目录字符串:
def get_logical_path(path):
logical_path = ""
lexer = FolderPathLexer(path)
while lexer.pos < len(path):
lexer.advance()
if isinstance(lexer.tokens[-1], str):
logical_path += lexer.tokens[-1]
else:
raise ValueError("Invalid FolderPathLexer token: ".format(lexer.tokens[-1]))
上面的代码使用了FolderPathLexer
类来读取目录和文件名。请注意,对于os.walk()
函数,该方法在遍历目录时可以生成更丰富的上下文目录路径,因此通常建议使用该方法代替上述自定义解析方式。
领取专属 10元无门槛券
手把手带您无忧上云