私は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')
、root
はfiles
とdirs
が存在するディレクトリを参照します。
::のpython 3.4を使用している、あなたは再帰的な検索を行うためにpathlibを使用することができます 'UnikatniICP =セット()'/'UnikatniICP.add(ライン)'速く行くかもしれません。注文について気にしなければ、 'distinct.writelines(set(SeznamICP_all))'が最も速くなるかもしれません。 –