[好吧我编辑我的问题,因为我得到了与我之前帖子的第一行相对应的答案,实际上这不是问题...所以如果你发布smtg请先测试并阅读整篇文章然后再思考我需要知道如何在python中测试路径;)]
整个脚本,详情如下: http://www.pasteall.org/38511/python
脚本在Windows 8 / python33和winXP / python 322上不返回相同 这是关于dir在windows box上存在的测试。
说我使用带有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()的调用打破了字符串中的某些内容?
第一次发布
(对不起,如果它重复,我猜这个 String concatenation in 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时,目录测试总是返回true ..? 几小时后挖掘和试验报价和斜杠......我发现问题就在这一行:
tpath += '/%s'%parts[pi]
和
tpath = '%s/%s'%(tpath,parts[pi])
解决了这个案子。
对我来说非常奇怪,奇怪的是我的意思是绝对的迷幻,是生成的字符串无论代码看起来都是一样的:
print(os.path.isdir(tpath),tpath==path)
在第一种情况下为最后一个目录提供'True True': 生成和输入字符串是相同的(类型是字符串),但最后一个目录不存在..
在版本之后它会返回一个'False True'。
我非常害怕。几个小时后,世界看起来很奇怪。什么附加字符串+ =连接类型是好的,bool()测试是好的......?请让我免于疯狂..非常感谢。
答案 0 :(得分: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()连接
[等待马克批准:)]