-3

私はPythonを初めて使用し、毎日多くのことを学びます。仕事に役立つ自動スクリプトを実行したいと思います。

いくつかのファイルを含む特定のフォルダーがあります。このスクリプトを再利用したいので、ツールをファイル固有にしたくないので、特定のタイトルのファイルを検索します。

ファイルの中央に「paths」という行があり、その下に「file path ="Somepath"」のような多くのパスがあるとします。

スクリプトを指定したディレクトリに移動して、このタイトル「パス」を含むファイルを探し、パスの1つ(パスはそのすぐ下にあります)をコピーして、それを作成します。

次に、このパスを使用してファイルなどをダウンロードしますが、この部分はすでに実行しています。特定のフォルダが指定されたときにファイル内の特定の文字列を検索して、必要な文字列をコピーする方法がわかりません。

つまり、フォルダ(C:\ Folder)があり、そのフォルダに3つのファイル(1,2,3)があるとします。

この種のパターン「パス」を含むファイルを探し、その下で指定されたパスまたはパスの少なくとも1つをコピーしたいと思います。「filepath=C:\ somepath」のようになりますので、ファイルの内容は次のようになります。

blabla

blabla

パス

ファイルパス=C:\ somepath

ファイルパス=C:\ somepath2

blabla

C:\ somepathをコピーして、仕事の一部として使用したいと思います。

すべてのヘルパーに感謝します。それは私にとって非常に重要です。

4

2 に答える 2

1
于 2013-03-19T23:46:17.083 に答える
-1

コメントから、データは実際には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下の最初のノード、または属性を持つ最初のノードなどを処理する方法を理解するのは非常に簡単です。pathsfilepath

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であり、バックスラッシュをフォワードスラッシュに変換すると、必要な結果が得られません。

しかし、うまくいけば、私はあなたが実際に望むものを何でも構築するのに十分なものをあなたに与えました。

于 2013-03-20T02:09:17.207 に答える