我是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脚本的目录中。我尝试通过路径使其工作以获取要使用的文件的绝对路径,但是我收到更多错误,请参阅脚本:
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'
你能帮帮我吗?
答案 0 :(得分:1)
您正在寻找的模式如下:
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
指的是files
和dirs
存在的目录。
答案 1 :(得分:0)
您在Rob的回答中已经解释过的问题是因为您没有加入路径所以一旦离开cwd,您在目录之外找到文件但在cwd中查找它们。
由于您正在使用oythin3,因此您还有其他几个选项来查找文件,如果您的python3版本为3.5,则可以使用glob递归搜索找到所有 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,则可以使用pathlib进行递归搜索:
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')