2

私は最初の Python スクリプトを 99% 実行しましたが、ディレクトリ内のファイルに対する for-each ループに相当するものにつまずいてしまいました。私のスクリプトは単一のファイルに対して機能していますが、一度に 1 つずつ複数のファイルに適用する方法がわかりません。

path = ~/documents除外したいファイル名を含むパスと XML ファイルがあります。

 <root><synced name="Already Synced"><sfile name="Filename">base</sfile><sfile name="Filename">File1.blah</sfile><sfile name="Filename">File2.blah</sfile><sfile name="Filename">File3.blah</sfile></synced></root>

*.blahたとえば、 XML sfile で終わり、XML sfile に含まれていないすべてのファイルに対してスクリプトを実行するにはどうすればよいでしょうか。

私はこれを持っていましたが、それはうまくいきませんでした:

path = '~/documents'
tree = ET.parse("sync_list.xml")
root = tree.getroot()
for elem in root.findall('sfile'):
    synced = elem.text
do_library = os.listdir(path)
if glob.fnmatch.fnmatch(file,"*.blah") and not synced:
  for entry in do_library:
    file = os.path.join(path, entry)
    result = plistlib.readPlist('file')

ご協力いただきありがとうございます。

4

2 に答える 2

1
path = '~/documents'

documentsこれは、ホームディレクトリ内のフォルダーを提供しません。~は実際にはホームディレクトリを表すものではありません。シェルがチルダ展開を行っているかのように使用できます。それがなければ、~任意のファイルまたはディレクトリの名前にすることができ、python はそれをそのように扱います。正しく取得するには、次を使用します。

path = os.path.expanduser('~/documents')
于 2012-11-20T19:16:02.347 に答える
1
import fnmatch
import os

path = os.path.expanduser('~/documents')
tree = ET.parse("sync_list.xml")
root = tree.getroot()
synced = [elt.text for elt in root.findall('synced/sfile')]
for filename in os.listdir(path):
    if fnmatch.fnmatch(filename, '*.blah') and filename not in synced:
        filename = os.path.join(path, filename)

編集: @mata の提案に従って、os.path.expanduser を追加しました。

于 2012-11-20T19:12:47.447 に答える