2013-05-08 103 views
2

我有以下代码:os.path.isdir不返回true

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路径

我试图逃脱,不逸出(即我通过解析SVN的日志的结果获得),许多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 

UPDATE

这是代码的一种变通方法版本,但我仍然不能做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 
+1

究竟是什么'svn_drive',' svn_repo_path'和'relative_path'。他们是如何产生的?你为什么使用'.encode()'? – 2013-05-08 09:26:41

+0

更新了与该信息的问题 – roundcrisis 2013-05-08 09:29:01

+0

我使用编码,因为我在REPL中尝试相同的东西,它的工作(即isdir返回true) – roundcrisis 2013-05-08 10:19:12

回答

1

我认为svn_drive应该是D:/而不是D:。看到这一行的documentation

Note that on Windows, since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not c:\foo.

+0

我刚试过这并没有什么区别。我也尝试在REPL中运行它,并且os.path.join('D:',os.sep,'whatever')是返回有效路径的唯一东西: >>> os.path.join ('D:','mypath') 'D:mypath' >>> os.path。加入( 'd:\', 'mypath中') 文件 “”,第1个 os.path.join( 'd:\', 'mypath中') ^ 语法错误:无效的语法 >>> OS。 path.join( 'd:\\, 'mypath中') 文件 “”,第1个 os.path.join(' d:\\, 'mypath中') ^ 语法错误:无效的语法 >>> os.path.join('D:',os.sep,'mypath') 'D:\\ mypath' – roundcrisis 2013-05-08 09:50:54

+0

对不起,我在这台机器上没有VM,os.path.join('D: /','不管')工作? – 2013-05-08 09:52:25

+0

不用担心,我在REPL上试过了,它返回'D:/ mypath',然后我尝试了上面的脚本和相同的目录(dirs无法识别):d:/ mysvn \ trunk \ TexturePacker不是目录 – roundcrisis 2013-05-08 09:56:29

1

我没有看到一个点在使用encode但如果它是绝对必要的话,我建议你进一步调节它的结果将其通过os.path.normpath,然后把它扔在os.path.isdir

+0

我没有问题,删除编码,当我这样做时,我得到相同的行为。有点无关,但即使尝试imghdr.what(os.path.normpath(文件名))或imghdr.what(文件名)或编码,他们都给我一个IO错误(我已验证文件在那里) – roundcrisis 2013-05-08 11:40:36

0

好了,该解决方案从另一个问题就来了,我在年底剥离\ R,我相信这是一个由path.join添加,但没了 python filename on windows

+0

在类似情况下'打印所传递的变量通常在调试时非常有用。请详细说明答案并将其标记为已回答。 – 2013-05-08 18:06:15

+0

感谢您的答案顺便说一句,我确实使用print,但我愚蠢地(?)认为os.path.normpath会失败或处理它看起来不像路径并修复它的事实。 – roundcrisis 2013-05-08 18:25:51

+1

'help'确实方便快速查找。只需'help(os.path.normpath)'。另外你可以使用'op = os.path'来保存一些输入。并且请点击评论框右下角的帮助链接以获得一些快速格式化小技巧。它们使阅读帖更容易,类似于使阅读和书写代码更容易的缩进。 – 2013-05-08 18:51:02