1

私がそのようなフォルダを持っていると仮定します

  rootfolder
      | 
     / \ \
    01 02 03 ....
    |
  13_itemname.xml

したがって、私のルートフォルダの下では、各ディレクトリは01 02 03のような月を表し、これらのディレクトリの下には、16_item1.xml、24_item1.xmlなどの作成時間とアイテム名を持つアイテムがあります。 1時間ごとに作成されます。

今、私は2つのことをしたいと思います。

  • 1か月のアイテム名のリストを生成する必要があります。つまり、01の場合、item1、item2、item3が含まれています。

  • item1のように、各アイテムをフィルタリングする必要があります。01_item1.xmlから24_item1.xmlまでそれぞれを読み取りたいです。

Pythonでこれらを簡単に実現するにはどうすればよいですか?

4

3 に答える 3

5

これがあなたが求めることをする2つの方法です(私がそれを正しく理解していれば)。1つは正規表現あり、もう1つはなし。あなたはあなたが好むものを選ぶ;)

魔法のように見えるかもしれない1つのビットは、「setdefault」行です。説明については、ドキュメントを参照してください。それがどのように機能するかを理解するために、私はそれを「読者への演習」として残します;)

from os import listdir
from os.path import join

DATA_ROOT = "testdata"

def folder_items_no_regex(month_name):

   # dict holding the items (assuming ordering is irrelevant)
   items = {}

   # 1. Loop through all filenames in said folder
   for file in listdir( join( DATA_ROOT, month_name ) ):
      date, name = file.split( "_", 1 )

      # skip files that were not possible to split on "_"
      if not date or not name:
         continue

      # ignore non-.xml files
      if not name.endswith(".xml"):
         continue

      # cut off the ".xml" extension
      name = name[0:-4]

      # keep a list of filenames
      items.setdefault( name, set() ).add( file )

   return items

def folder_items_regex(month_name):

   import re

   # The pattern:
   # 1. match the beginnning of line "^"
   # 2. capture 1 or more digits ( \d+ )
   # 3. match the "_"
   # 4. capture any character (as few as possible ): (.*?)
   # 5. match ".xml"
   # 6. match the end of line "$"
   pattern = re.compile( r"^(\d+)_(.*?)\.xml$" )

   # dict holding the items (assuming ordering is irrelevant)
   items = {}

   # 1. Loop through all filenames in said folder
   for file in listdir( join( DATA_ROOT, month_name ) ):

      match = pattern.match( file )
      if not match:
         continue

      date, name = match.groups()

      # keep a list of filenames
      items.setdefault( name, set() ).add( file )

   return items
if __name__ == "__main__":
   from pprint import pprint

   data = folder_items_no_regex( "02" )

   print "--- The dict ---------------"
   pprint( data )

   print "--- The items --------------"
   pprint( sorted( data.keys() ) )

   print "--- The files for item1 ---- "
   pprint( sorted( data["item1"] ) )


   data = folder_items_regex( "02" )

   print "--- The dict ---------------"
   pprint( data )

   print "--- The items --------------"
   pprint( sorted( data.keys() ) )

   print "--- The files for item1 ---- "
   pprint( sorted( data["item1"] ) )
于 2009-11-09T08:06:24.477 に答える
0

あなたが何をしたいのか正確にはわかりませんが、ここに役立つかもしれないいくつかのポインタがあります


ファイル名の作成(「%02d」はゼロが残っているパッドを意味します)

foldernames = ["%02d"%i for i in range(1,13)]

filenames = ["%02d"%i for i in range(1,24)]


文字列の連結ではなく、 os.path.joinを使用して複雑なパスを構築します

os.path.join(foldername,filename)

ファイルが最初に存在するかどうかを確認するためのos.path.exists

if os.path.exists(newname):
    print "file already exists"

ディレクトリの内容を一覧表示するには、globを使用します

from glob import glob
xmlfiles = glob("*.xml")

フォルダの作成、ファイルの名前変更などの高レベルの操作には、shutilを使用します

shutil.move(oldname,newname)


フルパスからファイル名を取得するためのbasename

filename = os.path.basename(fullpath)

于 2009-11-09T08:23:44.537 に答える
0

アイテム名に固定長のプレフィックスとサフィックス(つまり、「01_」などの3文字のプレフィックスと「.xml」の4文字のサフィックス)があるとすると、問題の最初の部分は次のように解決できます。

names = set(name[3:-4] for name in os.listdir('01') if name.endswith('.xml')]

それはあなたにユニークなアイテム名を与えるでしょう。

各アイテムをフィルタリングするには、そのアイテムの名前で終わるファイルを探し、必要に応じて並べ替えます。

item_suffix = '_item2.xml'
filtered = sorted(name for name in os.listdir('01') if name.endswith(item_suffix))
于 2009-11-09T08:17:09.337 に答える