当给定实际现有目录的路径时,os.path.isdir不返回True

时间:2013-05-08 09:23:44

标签: 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:\mysvn\trunk\Assets\myfile.max  is not a directory    
D:\mysvn\\Animations  is not a directory
....

即。问题是os.path.isdir似乎没有认识到path实际上是一个目录的事实

svn_drive是本案例中的驱动器号D: 在这种情况下svn_repo_path mysvn relative path是相对于svn repo的路径(我通过解析svn log的结果获得)

我尝试过逃避,而不是逃避许多os.path方法(abspathbasename等),似乎没有任何工作:(

我也接受替代方案;),我只是想知道一条路径,然后通过电子邮件发送文件,真的不介意(我知道有时人们想保留他们的代码,但这只是一个独立的脚本)

我还需要在稍后阶段打开该文件,然后通过电子邮件发送该文件,我得到的文件未找到,我将从此处开始猜测

完整功能列表(如果有帮助):

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

更新

这是代码的变通版本,但我仍然无法imghdr.what(filename)(其中filename是结果中的一个文件)

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

3 个答案:

答案 0 :(得分:1)

我认为svn_drive应为D:/而不是D:。请参阅documentation

中的这一行
  

请注意,在Windows上,由于每个驱动器都有一个当前目录,os.path.join(“c:”,“foo”)表示相对于驱动器C上当前目录的路径:(c:foo) ,而不是c:\ foo。

答案 1 :(得分:1)

我没有看到使用encode的重点,但如果它是绝对的必须,那么我建议你通过传递os.path.normpath进一步调整结果,然后将其扔到os.path.isdir }

答案 2 :(得分:0)

好的,解决方案来自另一个问题,我不得不在最后删除\ r \ n,我确信这是由path.join添加但不是 python filename on windows