4

Windows 環境で作成した xml 構成ファイルがいくつかありますが、Linux にデプロイされています。これらの構成ファイルは、ファイルパスで相互に参照します。以前、大文字と小文字の区別と末尾のスペースの問題がありました。これらの問題をチェックするスクリプトを書きたいと思います。それが役立つなら、Cygwinがあります。

例:

ファイル foo/bar/baz.xml への参照があるとしましょう。

<someTag fileref="foo/bar/baz.xml" />

間違ってこれを行うと、次のようになります。

<someTag fileref="fOo/baR/baz.Xml  " />

Windows では引き続き動作しますが、Linux では失敗します。

私がやりたいことは、これらのファイルのファイル参照が大文字と小文字の区別に関して実際のファイルと一致しないこれらのケースを検出することです。

4

2 に答える 2

3

ディレクトリのos.listdirは、大文字と小文字を保持するすべてのファイルシステム (Windows のファイルシステムを含む) で、リストしているディレクトリ内のファイル名の実際の大文字と小文字を返します。

したがって、パスの各レベルでこのチェックを行う必要があります。

def onelevelok(parent, thislevel):
  for fn in os.listdir(parent):
    if fn.lower() == thislevel.lower():
      return fn == thislevel
  raise ValueError('No %r in dir %r!' % (
      thislevel, parent))

ここで、名前の大文字と小文字のバリエーションがまったくないことは別の種類のエラーであると想定しており、そのために例外を使用しています。そして、パス全体について (とにかく Windows に変換されないドライブ文字や UNC がないことを前提としています):

def allpathok(path):
  levels = os.path.split(path)
  if os.path.isabs(path):
    top = ['/']
  else:
    top = ['.']
  return all(onelevelok(p, t)
             for p, t in zip(top+levels, levels))

たとえば、 が現在のディレクトリにあるfoo/barという意味ではなく、別の場所にあるという意味である場合は、これを調整する必要があるかもしれません。fooまたは、もちろん、UNC またはドライブ文字が実際に必要な場合 (ただし、前述したように、それらを Linux に変換するのは簡単ではありません;-)。

実装上の注意: 私は、zip圧縮するシーケンスの最短の長さを超えて「余分なエントリ」をドロップするという事実を利用しています。levelsそのため、最初の引数から「葉」(最後のエントリ) を明示的に切り取る必要はありzipません。all可能な場合は短絡Falseし、false 値を検出するとすぐに戻るため、明示的なループと同じくらい優れていますが、より高速で簡潔です。

于 2009-08-31T14:45:10.710 に答える
0

問題が何であるかを正確に判断するのは難しいですが、ファイル名を保存する前os.path.normcaseに一緒に適用するとstr.stript、すべての問題が解決するはずです.

私がコメントで言ったように、どのようにしてそのような間違いに終わっているのかは明らかではありません. ただし、適切な規則がある限り、既存のファイルをチェックするのは簡単です (たとえば、すべてのファイル名は小文字です)。

try:
    open(fname)
except IOError:
    open(fname.lower())
于 2009-08-31T10:12:25.000 に答える