Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析目录和所有子目录中的所有XML文件_Python_Xml_Python 3.x_Xml Parsing_Directory - Fatal编程技术网

Python 解析目录和所有子目录中的所有XML文件

Python 解析目录和所有子目录中的所有XML文件,python,xml,python-3.x,xml-parsing,directory,Python,Xml,Python 3.x,Xml Parsing,Directory,我是Python新手,但我对Delphi有一些经验。 我试图制作一个脚本,能够搜索目录中的所有xml文件(包括该目录中的所有子目录),然后解析这些xml并将其中的一些数据(数字)保存到一个简单的txt文件中。之后,我通过该txt文件创建另一个txt文件,其中只包含以前创建的txt文件中唯一的一组数字 我创建了以下脚本: import os from xml.dom import minidom #for testing purposes directory = os.getcwd() pri

我是Python新手,但我对Delphi有一些经验。 我试图制作一个脚本,能够搜索目录中的所有xml文件(包括该目录中的所有子目录),然后解析这些xml并将其中的一些数据(数字)保存到一个简单的txt文件中。之后,我通过该txt文件创建另一个txt文件,其中只包含以前创建的txt文件中唯一的一组数字

我创建了以下脚本:

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...')
它按照预期工作,直到有一个子目录,在这种情况下,我得到错误:

FileNotFoundError: [Errno 2] No such file or directory: 'RNN38987.xml'
这是因为文件位于子目录中,而不是位于包含python脚本的目录中。我试图通过path使其工作,以获得要使用的文件的绝对路径,但我遇到更多错误,请参阅脚本:

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...')
我现在遇到的错误我真的不明白,谷歌也帮不上忙-整个日志:

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'
Procházím aktuálníadresář,hledám XML soubory。。。
Procházím XML soubori,hledám IČP provádějícího。。。
C:\2_Programming\Python\IČP FINDER\src\20150225_1815_2561_1.xml
回溯(最近一次呼叫最后一次):
文件“C:\2_Programming\Python\IČP FINDER\src\ICP FINDER.py”,第17行,在
xmldoc=minidom.parse(soubor)
文件“C:\2\u Programming\Python\解释器\lib\xml\dom\minidom.py”,第1958行,在parse中
返回expatbuilder.parse(文件)
文件“C:\2\u Programming\Python\解释器\lib\xml\dom\expatbuilder.py”,第913行,解析
结果=builder.parseFile(文件)
文件“C:\2\u Programming\Python\Interpreter\lib\xml\dom\expatbuilder.py”,第204行,在parseFile中
buffer=file.read(16*1024)
AttributeError:“WindowsPath”对象没有属性“read”

你能帮我一下吗?

你要找的图案是:

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')

for
循环的每次迭代中,
root
指存在
文件和
目录的目录。

Rob的回答中已经解释过,您的问题是因为您没有加入路径,所以一旦离开cwd,您会在目录外找到文件,但会在cwd中查找它们

由于您使用的是oythin3,因此您有两个其他选项来查找文件,如果您的python3版本为3.5,则可以使用递归搜索来查找所有xml文件:

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')
或者,如果您使用的是python 3.4,则可以使用执行递归搜索:

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')

旁白:
unikatnicp=set()。如果您不关心顺序,
distinct.writelines(set(SeznamICP_all))
可能会运行得最快。谢谢,这很好!然而,当我发现并非所有XML文件都有带有属性icp的tag is时,我遇到了一个问题。有没有办法用minidom检查该标记的存在?