コメントから、データは実際にはXMLであり、必要なのは最初のノードpath
のすべての(または最初の)file
ノードの属性ですpaths
。
これは、XMLパーサーの観点から、実際にははるかに簡単に記述でき、はるかに堅牢です。
たとえば、これらはおそらくすべて有効なfile
ノードです。
<file path="C:\Foo\Bar" />
<file path="C:\Baz\Qux"/>
<file path="C:\Foo\Bar" />
<file path="C:\Spam\Eggs\" alt="other attribute cruft" />
<file alt="other attribute cruft" path="C:\Spam\Eggs\" />
<file path="C:\Spam\Spam\"></file>
そして、あなたはこれらを合法であるかどうかにかかわらず見るかもしれません:
<file path='C:\Eggs\"Spam Spam Spam"\"Spammity Spam"'/>
これらすべての可能性をプレーンテキストで処理しようとは思わないでしょう。しかし、それらすべてを処理しない場合、さらにはマーフィーの法則により、処理しないファイルが含まれるファイルに最終的に遭遇することが保証されます。
標準ライブラリに組み込まれているものも含めて、さまざまなXMLパーサーがたくさんありますが、最も単純なのはElementTreeだと思います。それで:
import os
import os.path
import xml.etree.ElementTree as ET
filepaths = {}
for filename in os.listdir(directory):
try:
doc = ET.parse(os.path.join(directory, filename))
paths = doc.find('paths')
filepaths[filename] = [f.attrib['path'] for f in paths.findall('file')]
except Exception as e:
# You may want to log something, treat different exceptions differently, etc.
pass
これを変更してpaths
、最初のノードではなくすべてのノード、すべてのノードではなくfile
下の最初のノード、または属性を持つ最初のノードなどを処理する方法を理解するのは非常に簡単です。paths
file
path
Python 2.xを使用していて、ファイルが非常に大きい場合、これは少し遅いかもしれません。ただし、を明示的に使用することで修正できますcElementTree
。これを行うことはかなり一般的です:
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
これにより、可能であれば高速の「C」実装が提供され、それ以外の場合は、CPython 2.5以降(2つがマージされた3.xを含む)、PyPyなどで低速の実装が提供されます。
その間、他のコメントから、あなたはあなたの元の投稿になかった追加のことを求めました:
私はただ…バックスラッシュを/にする必要があります
簡単だ。s.replace('\\', '/')
各パスを呼び出すだけs
です。
ただし、これは奇妙なことです。逆の方向に進むことはかなり一般的です(標準ライブラリに組み込まれています。<code> os.path.normpathはPOSIXではスラッシュをそのままにしますが、Windowsではバックスラッシュに変換します)が、ネイティブWindowsからPOSIXに移行するのは通常、URLの作成など、より大きな操作の一部です。この場合、おそらくより高いレベルの関数を使用する必要があります。
ファイルでは、それは-私が望む結果はC:\ folder\folderです
ここでは、末尾のバックスラッシュを削除したいようです。繰り返しになりますが、これは奇妙なことであり、おそらく実際にはこれよりも高いレベルの何かをしたいと思うでしょう(os.path.dirname
多分?)が、簡単です:s.rstrip('\\')
。
もちろん、これらの最後の2つは互いに矛盾しています。必要な結果がC:\folder\folder
であり、バックスラッシュをフォワードスラッシュに変換すると、必要な結果が得られません。
しかし、うまくいけば、私はあなたが実際に望むものを何でも構築するのに十分なものをあなたに与えました。