2017-08-22 2 views
1

あなたのための初心者プログラマです。Pythonを使用してXMLファイルに入力されているもの以外のフォルダ内のすべてのファイルを解析します。

私が持っているもの:

  1. 含むフォルダ、まあ、他のフォルダ(モジュール)とファイル(それは.TXT、.C、.H、の.pyなどでもよい)
  2. 基本的にはそのフォルダの構成を含むXMLファイル(モジュール名、短い名前だけでなく、除外リスト除外リストからのものは考慮して撮影してはいけません。)私はするつもり何

  • XMLファイルから情報を読んで、私はものを除き、指定したフォルダからすべてのファイルが
  • を除外されている適切
  • 解析を解析することができます問題でそれを保存

私のコードは、これまでのようになります。この1つは読んでいました

明らかにXMLファイルです
<?xml version="1.0"?> 
<Modules> 
    <Module> 
     <Name>MOD_Test1</Name> 
     <Shortname>1</Shortname> 
     <ExcludeList> 
      <File>HeaderFile.h</File> 
      <File>CFile.c</File> 
     </ExcludeList> 
    </Module> 
    <Module> 
     <Name>MOD_Test2</Name> 
     <Shortname>2</Shortname> 
     <ExcludeList> 
      <File>TextFile.txt</File> 
     </ExcludeList> 
    </Module> 
</Modules> 

def GetExceptFiles(ListOfExceptFiles = []): 
    tree = ET.ElementTree(file='Config.xml') 
    Modules = tree.getroot() 
    for Module in Modules: 
     for Attribute in Module: 
      if Attribute.tag=='Name': 
       ModuleName = Attribute.text 
      if Attribute.tag=='Shortname': 
       ModuleShortName = Attribute.text 
      for File in Attribute: 
       ExceptFileName = File.text 
       print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName)) 
     if ExceptFileName is not None:   
      ListOfExceptFiles.append(ExceptFileName) 

このXMLファイルを除外しなければならないファイルのリストを私に提供します。これは仕事ですが、貧弱です。 2つのモジュールが全く同じ名前のファイルを持っているとしましょう。一つは除外され、もう一つは除外されます。両方ともスキップされます。

def Parse(walk_dir): 
print('walk_dir = ' + walk_dir) 
for root, subdirs, files in os.walk(walk_dir): 
    print('-------------------------------------------------------\nroot = ' + root) 
    for filename in files: 
     with open(os.path.join(root, filename), 'r') as src: 
      Text = src.read() 
      print ('\nFile %s contains: \n' %filename) + Text 

これは私が始めたことです。それは解析されません、私は知っていますが、一度私はファイルの内容を読むことができれば、私は確かに他のことも行うことができます。

  1. ファイル:私は

    for filename in files: 
         if filename not in ListOfExceptFile: 
          with open(os.path.join(root, filename), 'r') as src: 
    

    これらのための第二のIF文を追加してなかったすべて取り外し、例外ファイルの一部については

    はそれが正しい行いません二つのことです同じ名前の人が出力を壊します。

  2. xml内に複数の例外ファイルがある(1つのモジュールに対して)場合、最後のファイルはスキップされます。 (私の例ではHeaderFile.hはスキップされず、CFile.cます)

EDIT:bracco23さん@答えは私が考えるようになったと私は、モジュール名で複数のリストをマッピングすることに成功しなかったものの

def ReadConfig(Tuples = []): 
tree = ET.ElementTree(file='Config.xml') 
Modules = tree.getroot() 
for Module in Modules: 
    for Attribute in Module: 
     if Attribute.tag=='Name': 
      ModuleName = Attribute.text 
     for File in Attribute: 
      ExceptFileName = File.text 
      Tuple = (ModuleName, ExceptFileName) 
      Tuples.append(Tuple) 

は、それが近づいての良い方法です:キー(できれば、まだこの問題で助けを求めて)
これは私がリストのリストのアイデアから始まって持っているものでしょうか?

+0

これは良い質問ですが、メタ・コメンタリーや嘆願は省略されているのは、一般的には切り詰められ、誰かがそれをやるようになるからです。終わりに長い免責条項があるためではなく、問題の提示から努力が明らかになっていなければなりません(これらの逆説的な結果でダウンロードが生じることがあります。長い話は短い:それを簡潔に保つ! – halfer

+0

@halferそれを持って、ありがとう。 –

答えて

0

仕事は問題を解決するために対処する必要がひねりのちょうどMINRリストがある、かなり良いです:

1)あなたのGetExceptFiles(ListOfExceptFiles = [])あなたがのための最後にリストにファイルを追加するにはAttribute以上。これにより、最後のファイルだけが追加されます。ファイル内のforのチェックを移動すると、すべての除外ファイルがリストに追加されます。あなたは、属性のタグが唯一NameShortnameまたはExcludeListことができると仮定し、また

def GetExceptFiles(ListOfExceptFiles = []): 
    tree = ET.ElementTree(file='Config.xml') 
    Modules = tree.getroot() 
    for Module in Modules: 
     for Attribute in Module: 
      if Attribute.tag=='Name': 
       ModuleName = Attribute.text 
      if Attribute.tag=='Shortname': 
       ModuleShortName = Attribute.text 
      for File in Attribute: 
       ExceptFileName = File.text 
       print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName)) 
       if ExceptFileName is not None:   
        ListOfExceptFiles.append(ExceptFileName) 

(タブ/スペースのカップルは十分です)。これは確かにそして間違いありませんが、不正な形式のファイルは解析を中断します。すべてのattrbiutesのタグプロパティをチェックし、何か問題があった場合にエラーを発行することを検討してください。

2)私は同じ名前のファイルがモジュール間で共有された同じファイルであると仮定していますが、一部のモジュールでは除外されていますが、すべてではありません。この場合、除外されたファイルのリストは、除外モジュールが属するモジュールに関する情報を失います。モジュールの名前をキーとしてリストのマップを使用することを検討して、各モジュールに除外ファイルの独自のリストを持たせることができます。

EDIT使用する方法dictは(私は主にJavaの指向だし、この構造は、Javaでのマップと呼ばれますが、Pythonでdictある)のようになります。これがあることを前提としていること

def GetExceptFiles(DictOfExceptFiles = {}): 
    tree = ET.ElementTree(file='Config.xml') 
    Modules = tree.getroot() 
    for Module in Modules: 
     for Attribute in Module: 
      if Attribute.tag=='Name': 
       ModuleName = Attribute.text 
      if Attribute.tag=='Shortname': 
       ModuleShortName = Attribute.text 
      for File in Attribute: 
       ExceptFileName = File.text 
       if(ModuleName not in DictOfExceptFiles) 
        DictOfExceptFiles[ModuleName] = [] 
       DictOfExceptFiles[ModuleName].append(ExceptFileName) 
       print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName)) 

ご注意くださいModuleNameは、コンポーネントのordedに依存する最初のファイルの前にすでに設定されています。これはXMLが保証しないものです。これを解決するために、名前とショートネームを子タグからモジュールのXML属性に移動します。

<Module name="ModuleName" shortName="short name"> 
    ... 
</Module> 
+0

良いヒント、ありがとう!どのように私はマッピングを行うだろうか?私はグーグルではありますが、まだそれを理解していません。 –

+0

dictの例を示すために編集されています。 dict [here](https://docs.python.org/2/tutorial/datastructures.html)で詳細を読むことができます。 – bracco23

関連する問題