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

解析Python目录中的所有XML文件,python,parsing,xml-parsing,Python,Parsing,Xml Parsing,嗨,我正在尝试使用python解析给定目录中的所有XML文件。我可以一次解析一个文件,但这对我来说是“不可能”的,因为文件数量太多,也就是说,当我预先定义树和根时,它可以工作,但是当我尝试运行所有代码时,它就不能工作了 这是我迄今为止实施的: import xml.etree.ElementTree as ET import os directory = "C:/Users/danie/Desktop/NLP/blogs/" def clean_dir(directory): path

嗨,我正在尝试使用python解析给定目录中的所有XML文件。我可以一次解析一个文件,但这对我来说是“不可能”的,因为文件数量太多,也就是说,当我预先定义树和根时,它可以工作,但是当我尝试运行所有代码时,它就不能工作了

这是我迄今为止实施的:

import xml.etree.ElementTree as ET
import os
directory = "C:/Users/danie/Desktop/NLP/blogs/"

def clean_dir(directory):
    path = os.listdir(directory)
    print(path) 
    for filename in path:
        tree = ET.parse(filename)
        root = tree.getroot()
        doc_parser(root)


post_list = []
def doc_parser(root):
    for child in root.findall('post'):
        post_list.append(child.text)

clean_dir(directory)
print(post_list[0])
我得到的错误如下:

  File "D:\Anaconda\envs\Deep Learning New\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-91-fce6b0119ea7>", line 1, in <module>
    runfile('C:/Users/danie/Desktop/NLP/blogs/Parser_Tes.py', wdir='C:/Users/danie/Desktop/NLP/blogs')

  File "D:\Anaconda\envs\Deep Learning New\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "D:\Anaconda\envs\Deep Learning New\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/danie/Desktop/NLP/blogs/Parser_Tes.py", line 19, in <module>
    clean_dir(directory)

  File "C:/Users/danie/Desktop/NLP/blogs/Parser_Tes.py", line 9, in clean_dir
    tree = ET.parse(filename)

  File "D:\Anaconda\envs\Deep Learning New\lib\xml\etree\ElementTree.py", line 1196, in parse
    tree.parse(source, parser)

  File "D:\Anaconda\envs\Deep Learning New\lib\xml\etree\ElementTree.py", line 597, in parse
    self._root = parser._parse_whole(source)

  File "<string>", line unknown
ParseError: not well-formed (invalid token): line 103, column 225
所以我接受了@wundermahn和@Kevin的建议,使用try…除了。这是现在的输出。i、 e.19320件中的482件。现在的问题是,当我试图打印列表中的某个元素时
post\u list[]
。我得到以下错误:

IndexError: list index out of range
有错误的文件:

ERROR ON FILE: 669116.female.26.indUnk.Gemini.xml
ERROR ON FILE: 669514.female.27.indUnk.Sagittarius.xml
ERROR ON FILE: 669656.female.23.Advertising.Aries.xml
ERROR ON FILE: 669719.male.26.Science.Taurus.xml
ERROR ON FILE: 669764.female.17.indUnk.Sagittarius.xml
ERROR ON FILE: 670277.female.27.Education.Sagittarius.xml
ERROR ON FILE: 670314.male.24.indUnk.Leo.xml
ERROR ON FILE: 670684.male.24.Student.Libra.xml
ERROR ON FILE: 671748.male.27.Communications-Media.Aries.xml
ERROR ON FILE: 673093.male.27.Construction.Scorpio.xml
ERROR ON FILE: 673235.male.37.Internet.Capricorn.xml
ERROR ON FILE: 67459.male.34.Arts.Capricorn.xml
ERROR ON FILE: 674684.female.23.Religion.Libra.xml
进一步检查并打印出
post_list
,由于某些原因,数据未被追加,且为空


再次感谢

@Kevin的评论是正确的,这个错误与无法正确解析文档有关。有些东西不是“true
XML
”,它可能只是一个奇怪的非unicode字符之类的简单东西

您可以尝试执行以下操作来帮助调试:

import xml.etree.ElementTree as ET
import os
directory = "C:/Users/danie/Desktop/NLP/blogs/"

def clean_dir(directory):
    path = os.listdir(directory)
    print(path) 
    for filename in path:
        try:
            tree = ET.parse(filename)
            root = tree.getroot()
            doc_parser(root)
        except:
            print("ERROR ON FILE: {}".format(filename))


post_list = []
def doc_parser(root):
    for child in root.findall('post'):
        post_list.append(child.text)

clean_dir(directory)
print(post_list[0])
添加语句将尝试每个文件,如果有错误,则打印出导致错误的文件


我没有任何数据要测试,但这应该可以修复错误。

看起来您的一个文件没有正确解析。尝试将
print(filename)
放在
ET.parse
行的前面。查看崩溃前最后打印的文件名,用文本编辑器打开该文件,查看第103行第225列附近是否有任何奇怪的内容。@Kevin查看edit@xalalau,如果问题出在您的帖子列表上,请随时发布另一个问题。我们中的一些人(包括我自己!)真的很喜欢信息检索问题。如果我下面的回答解决了最初的问题(看起来是这样的),请接受它,以便其他人将来可以使用它:)这个答案不应该以它的当前形式被接受-这个“异常处理”使用太宽的try子句和裸露的except子句是一种anttipattern模式,实际上比完全没有异常处理更糟糕。事实上,它确实给OP带来了另一个问题:
import xml.etree.ElementTree as ET
import os
directory = "C:/Users/danie/Desktop/NLP/blogs/"

def clean_dir(directory):
    path = os.listdir(directory)
    print(path) 
    for filename in path:
        try:
            tree = ET.parse(filename)
            root = tree.getroot()
            doc_parser(root)
        except:
            print("ERROR ON FILE: {}".format(filename))


post_list = []
def doc_parser(root):
    for child in root.findall('post'):
        post_list.append(child.text)

clean_dir(directory)
print(post_list[0])