2

[ OK、以前の投稿の最初の行に対応する回答を得たばかりなので、質問を編集します。実際、これは質問ではありませんでした。smtg を投稿する場合は、事前にテストして、知る必要があると考える前にすべてを読んでください。 Pythonでパスをテストする方法;)]

以下に詳述するスクリプト全体: http://www.pasteall.org/38511/python

スクリプトは、Windows 8 / python33 と winXP / python 322 で同じ結果を返しません 。これは、Windows ボックスでのディレクトリ存在テストに関するものです。

Python 3.3でWindows 8ボックスを使用していると言う

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

hdにこの既存のパスがあります:

D:\ImHere\meToo

これらのディレクトリが存在することを確認する簡単なスクリプト(コマンド管理プロンプトを使用してスクリプトを実行しています):

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: OK

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 を使用している場合、ディレクトリ テストは常に 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 が言及したように、Unicode 形式に関連する Python 3.3 の os.path.isdir() にはバグがあります ( #17137 )。次のリリースとアルファで修正されるようです。

一方、フォルダー名が特定のパスに存在するかどうかをテストするために、テスト ループで "path +=" 文字列連結ではなく os.path.join() を使用して、os と python >= 3.2 バージョンが何であれ、一貫した結果を得ました。 :

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 に答える