Python 当给定指向实际现有目录的路径时,os.path.isdir不返回True
我有以下代码:Python 当给定指向实际现有目录的路径时,os.path.isdir不返回True,python,os.path,Python,Os.path,我有以下代码: path = os.path.join(svn_drive, svn_repo_path, relative_path) if os.path.isdir(path.encode('string-escape')): print path, " is a directory" else: print path, " is not a directory" 其结果如下: D:
path = os.path.join(svn_drive, svn_repo_path, relative_path)
if os.path.isdir(path.encode('string-escape')):
print path, " is a directory"
else:
print path, " is not a directory"
其结果如下:
D:\mysvn\trunk\Assets\myfile.max is not a directory
D:\mysvn\\Animations is not a directory
....
i、 问题是,os.path.isdir
似乎没有意识到path
实际上是一个目录
svn\u drive
是本例中的驱动器号D:
svn\u repo\u路径在本例中为mysvn
相对路径
是相对于svn回购的路径(我通过解析svn日志的结果获得)
我尝试了转义,而不是转义,许多os.path
方法(abspath
,basename
,等等)似乎都不起作用:(
我也接受其他选择;),我只想知道路径,然后通过电子邮件发送文件,不介意如何发送(我知道有时人们希望保留他们的代码,但这只是一个独立的脚本)
我还需要在稍后阶段打开该文件以发送电子邮件,我会收到一个未找到的文件,我将从这里开始猜测
完整函数列表(如果有帮助):
更新
这是代码的变通版本,但我仍然无法执行imghdr。什么(文件名)
(其中filename
是结果中的文件之一)
我认为svn\u-drive
应该是D://
而不是D:
。请参见中的这一行:
请注意,在Windows上,由于每个驱动器都有一个当前目录,因此os.path.join(“c:,“foo”)表示相对于驱动器c:(c:foo)上当前目录的路径,而不是c:\foo
我认为使用encode
没有任何意义,但如果它是绝对必须的,那么我建议您通过os.path.normpath
将其传递给os.path.isdir进一步调整其结果,然后将其扔到os.path.isdir好的,解决方案来自另一个问题,我必须在最后剥离\r,我确信这是由path.join添加的,但是没有
什么是svn\u驱动器
,svn\u repo\u路径
和相对路径
。它们是如何产生的?为什么要使用.encode()
?用该信息更新了问题我使用encode是因为我在REPL中尝试了相同的事情,并且成功了(即isdir返回true)请引用任何临时路径
和路径
的值pairI刚刚尝试过,没有产生任何影响。我还尝试在REPL和os.path中运行它。join('D:',os.sep,'whatever')是唯一返回有效路径的东西:>>>os.path.join('D:','mypath')'D:mypath'>>>os.path.join('D:\','mypath')文件“”,第1行os.path.join('D:\','mypath')^SyntaxError:无效语法>>os.path.join('D:\\,'mypath')文件“”,第1行os.path.join('D:\\,'mypath')^SyntaxError:无效语法>>>os.path.join('D:',os.sep,'mypath')'D:\\mypath'很抱歉,我在这台机器上没有虚拟机,os.path.join('D:/','whatever'))工作?不用担心,我试过REPL,它返回'D:/mypath',然后我试过上面的脚本,同样的(dir不被识别):D:/mysvn\trunk\TexturePacker不是一个目录一件奇怪的事情,如果我在REPL os.path.isdir上执行以下操作(“D:/mysvn\TexturePacker.encode('string-escape')),则返回true(目录当然存在)但是,使用python脚本运行同一行返回False我在删除encode时没有问题,当我删除encode时,我得到相同的行为。有点不相关,但甚至尝试imghdr.what(os.path.normpath(filename))或imghdr.what(filename)或encoded它们都会给我一个IO错误(我已经验证了文件是否存在)在类似的情况下,print
ing正在传递的变量在调试时通常是一个非常有用的练习。请详细说明答案并将其标记为已回答。谢谢回答。顺便说一句,我确实使用了print,但我愚蠢地(?)认为os.path.normpath可能会失败,或者处理它看起来不像路径的事实,然后修复它。help
非常方便快速查找。只需help(os.path.normpath)
。另外,您可以使用op=os.path
来节省一些输入。请点击评论框右下角的“帮助”链接,获取一些快速格式化的小贴士。它们使阅读文章更容易,类似于缩进,使读写代码更容易。感谢所有提示,非常感谢:D
def parse_svn_results(lines, svn_drive, svn_repo_path):
result = []
for x in lines.split("\n"):
if "trunk/" in x:
relative_path = x.lstrip('MDA ').replace("/","",1).replace("/", os.sep)
path = os.path.join(svn_drive, svn_repo_path, relative_path)
if os.path.isdir(path.encode('string-escape')):
print path, " is a directory"
else:
print path, " is not a directory"
result.append(path)
return result
def parse_svn_results(lines, svn_drive, svn_repo_path):
result = []
for x in lines.split("\n"):
if "trunk/" in x:
relative_path = x.lstrip('MDA ').replace("/", "", 1).replace("/", os.sep)
temp_path = os.path.join(svn_drive, os.sep, svn_repo_path, relative_path)
path = format_path(temp_path)
if path is not None:
result.append(path)
return result
def format_path(file_destination):
file_name = os.path.basename(file_destination)
path = os.path.dirname(file_destination)
base, ext = os.path.splitext(file_name)
picture_format = None
e = ext if picture_format is None else '.%s' % picture_format.lower()
if e:
to_path = os.path.join(path, base + e)
return to_path