2016-07-05 19 views
1

私はPythonを初めて使用していますが、私はDelphiでいくつかの経験があります。 ディレクトリ内のすべてのXMLファイル(そのディレクトリ内のすべてのサブディレクトリを含む)を検索し、そのXMLを解析してそこからいくつかのデータ(数値)を単純なtxtファイルに保存できるスクリプトを作成しようとしています。その後、私はそのtxtファイルを使って、以前に作成されたtxtファイルからのユニークな数字セットだけを持つ別のtxtファイルを作成します。ディレクトリとすべてのサブディレクトリ内のすべてのXMLファイルを解析する

私はこのスクリプトを作成しました:

import os 
from xml.dom import minidom 

#for testing purposes 
directory = os.getcwd() 

print("Procházím aktuální adresář, hledám XML soubory...") 
print("Procházím XML soubory, hledám IČP provádějícího...") 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       xmldoc = minidom.parse(file) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

print("Vytvářím list unikátních IČP...") 

with open ('ICP_distinct.txt','w') as distinct: 
    UnikatniICP = [] 
    with open ('ICP_all.txt','r') as SeznamICP_all: 
     for line in SeznamICP_all: 
      if line not in UnikatniICP: 
       UnikatniICP.append(line) 
       distinct.write(line) 

print('Počet unikátních IČP:' + str(len(UnikatniICP))) 
input('Pro ukončení stiskni libovolnou klávesu...') 

intentedとしてそれは、その場合には、私はエラーを取得し、サブディレクトリがあるだけまで動作します:ファイルがあることに起因する

FileNotFoundError: [Errno 2] No such file or directory: 'RNN38987.xml' 

サブディレクトリにあり、pythonスクリプトを持つディレクトリではありません。私はそれがで動作するように、ファイルの絶対パスを取得するには、パスを経由して動作させることを試みたが、私はより多くのエラーを取得しています、スクリプトを参照してください。

import os 
from xml.dom import minidom 
from pathlib import Path 

#for testing purposes 
directory = os.getcwd() 

print("Procházím aktuální adresář, hledám XML soubory...") 
print("Procházím XML soubory, hledám IČP provádějícího...") 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       soubor = Path(file).resolve() 
       print(soubor) 
       xmldoc = minidom.parse(soubor) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

print("Vytvářím list unikátních IČP...") 

with open ('ICP_distinct.txt','w') as distinct: 
    UnikatniICP = [] 
    with open ('ICP_all.txt','r') as SeznamICP_all: 
     for line in SeznamICP_all: 
      if line not in UnikatniICP: 
       UnikatniICP.append(line) 
       distinct.write(line) 

print('Počet unikátních IČP:' + str(len(UnikatniICP))) 
input('Pro ukončení stiskni libovolnou klávesu...') 

私は今取得していますエラー、私は本当に理解していないとGoogleはどちらか助けていません - 全体のログを:

Procházím aktuální adresář, hledám XML soubory... 
Procházím XML soubory, hledám IČP provádějícího... 
C:\2_Programming\Python\IČP FINDER\src\20150225_1815_2561_1.xml 
Traceback (most recent call last): 
    File "C:\2_Programming\Python\IČP FINDER\src\ICP Finder.py", line 17, in <module> 
    xmldoc = minidom.parse(soubor) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\minidom.py", line 1958, in parse 
    return expatbuilder.parse(file) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\expatbuilder.py", line 913, in parse 
    result = builder.parseFile(file) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\expatbuilder.py", line 204, in parseFile 
    buffer = file.read(16*1024) 
AttributeError: 'WindowsPath' object has no attribute 'read' 

あなたは私を助けてくださいことはできますか?あなたのforループの各反復で

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       xmldoc = minidom.parse(os.path.join(root, file)) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

rootfilesdirsが存在するディレクトリを参照します。

+0

::のpython 3.4を使用している、あなたは再帰的な検索を行うためにpathlibを使用することができます 'UnikatniICP =セット()'/'UnikatniICP.add(ライン)'速く行くかもしれません。注文について気にしなければ、 'distinct.writelines(set(SeznamICP_all))'が最も速くなるかもしれません。 –

答えて

1

あなたが探しているパターンは次のようです。

+0

ありがとう、これはとてもうまくいっています!しかし、すべてのXMLファイルに属性icpというタグが付いているわけではないことがわかったときに問題に遭遇しました。そのタグの存在をミニドームで確認する方法はありますか? –

0

Robの答えで説明した問題は、パスに参加していないためです.cwdを離れると、ディレクトリ外のファイルを探していますが、cwdで探しています。

あなたのpython3のバージョンが3.5を再帰的に検索globを使用して、すべてのXMLファイルを見つけることができている場合は、ファイルを見つけるために、他のオプションのカップルを持っているoythin3使用しているので:

import glob 
import os 
from xml.dom import minidom 

directory = os.getcwd() 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for file in glob.iglob(directory+'/**/*xml', recursive=True): 
      xmldoc = minidom.parse(file) 
      itemlist = xmldoc.getElementsByTagName('is') 
      SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

それともあれば別に

from pathlib import Path 


with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for file in Path(directory).glob('**/*.xml') 
     xmldoc = minidom.parse(file) 
     itemlist = xmldoc.getElementsByTagName('is') 
     SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 
関連する問題