2

[ 好的,我编辑了我的问题,因为我刚刚得到了与我之前帖子的第一行相对应的答案,实际上这不是问题......所以如果你发布 smtg,请先测试并阅读整个内容,然后再认为我需要知道如何在 python 中测试路径;)]

整个脚本,详情如下: http: //www.pasteall.org/38511/python

该脚本在 Windows 8 / python33 和 winXP / python 322 上返回的结果不同 ,这是关于 Windows 框上的 dir 存在测试。

说我使用带有 python 3.3 的 windows 8 框

sys.version_info(major=3, minor=3, micro=0, releaselevel='final', serial=0)

我的高清上有这个现有路径:

D:\ImHere\meToo

确认我这些目录存在的简单脚本(我使用 cmd 管理员提示符来执行脚本):

import os
from os import path
import sys
print(sys.version_info)

def there(p) :
    print('%s %s'%(p,'exists' if os.path.isdir(p) else 'does not exist'))

# got True, ok
print('\nusuals')
path = "D:\ImHere\meToo"
there(path)

# got False, ok
path += "\ImNot"
there(path)

# a bit more academic, tests ok
elms = path.split('\\')
jpath = ''
for elm in elms :
    jpath = os.path.join(jpath,elm)
    there(jpath)

# ... ok
rpath = elms[0] + os.sep + elms[1] + os.sep + elms[2] + os.sep + elms[3]
there(rpath)

这在控制台中返回:

usuals
D:\ImHere\meToo exists
D:\ImHere\meToo\ImNot does not exist
D: exists
D:ImHere exists
D:ImHere\meToo exists
D:ImHere\meToo\ImNot does not exist
D:\ImHere\meToo\ImNot does not exist

但比较一下:

# now, this 'flat loop' is ok too
print('\nflat loop')
wpath = elms[0]
wpath += os.sep + elms[1]
wpath += os.sep + elms[2]
wpath += os.sep + elms[3]
there(wpath)

得到 :

flat loop
D:\ImHere\meToo\ImNot does not exist

有了这个 :

# but if one calls isdir() in the process
# something is altered, and this ALWAYS returns dir exists
print('\nfails ?')
wpath = elms[0]
wpath += os.sep + elms[1]
there(wpath)
wpath += os.sep + elms[2]
there(wpath)
wpath += os.sep + elms[3]
there(wpath)

win8/python 33:KO

fails ?
D:\ImHere exists
D:\ImHere\meToo exists
D:\ImHere\meToo\ImNot exists

winXP/python 322:好的

fails ?
D:\ImHere exists
D:\ImHere\meToo exists
D:\ImHere\meToo\ImNot does not exist

似乎对 isdir() 的调用会破坏字符串中的某些内容?

第一篇文章

(对不起,如果它是重复的,我想 Python 中的这个字符串连接 可以帮助解决这个问题,但是当我今晚生气时,我需要分享这个。)

我在一个模块中编写了这个小循环,以在它们不存在时创建递归目录。这在 xp、python 3.2 上运行良好:

def mkdir(path) :
    path = clean(path)  # this one generates unix like path
    parts = path.split('/')
    tpath = parts[0]
    for pi in range(1,len(parts)) :
        tpath += '/%s'%parts[pi]
        if os.path.isdir(tpath) == False :
            os.mkdir(tpath)

但是当使用 windows8 + python 33 时,目录 test 总是返回 true.. ?经过数小时的挖掘和试验引号和斜线的东西..我发现问题出在这一行:

tpath += '/%s'%parts[pi]

tpath = '%s/%s'%(tpath,parts[pi])

解决了这个案子。

对我来说很奇怪的是,奇怪的是我的意思是绝对迷幻的是,无论代码看起来如何,生成的字符串都是相同的:

print(os.path.isdir(tpath),tpath==path)

在第一种情况下,最后一个目录给了我'True True':生成的字符串和输入的字符串是相同的(并且类型是字符串),但是最后一个目录不存在..

并且在版本之后它应该返回一个'False True'。

我非常害怕。几个小时后,世界看起来很奇怪。什么附加字符串 += 连接类型是好的, bool() 测试是好的......?请让我免于疯狂..非常感谢。

4

1 回答 1

0

总结一下:正如 Mark Dickinson 提到的,python 3.3 中的 os.path.isdir() 存在与 Unicode 格式相关的错误(#17137)。它看起来会在下一个版本和 alpha 版本中修复。

同时,为了测试给定路径中是​​否存在文件夹名称,无论 os 和 python >= 3.2 版本是什么,我都得到了一致的结果,在测试循环中使用 os.path.join() 而不是 "path +=" 字符串连接:

path = "D:\ImHere\meToo\Imnot"

def there(p) :
    print('%s %s'%(p,'exists' if os.path.isdir(p) else 'does not exist'))

elms = path.split('\\')
jpath = ''
for elm in elms :
    jpath = os.path.join(jpath,elm)
    there(jpath)

所以,不要在 python 3.3 中使用 + 与 isdir() 连接,并与 join() 连接

[等待标记批准:)]

于 2013-02-16T16:06:38.953 回答