實作的功能是從兩個xml讀取多個子節點和屬性,比較相同子節點是否相同,将不同的内容儲存生成csv檔案。
# -*- coding: UTF-8 -*-
#作用:查詢表一表二的不同内容,表1相對于表2 ,表2相對于表1
#data1生成名字的list2
from __future__ import division
import csv
import re
import os
import math
import sys
from bs4 import BeautifulSoup
from tkinter.filedialog import askopenfilename
import pandas as pd
#定義進度條
def progressbar(cur, total):
percent = '{:.2%}'.format(cur / total)
sys.stdout.write('\r')
sys.stdout.write("[%-50s] %s" % ('=' * int(math.floor(cur * / total)),
percent))
sys.stdout.flush()
print('第一份xml檔案')
filename1 = askopenfilename(filetypes=( ("Text file", "*.xml*"),("HTML files", "*.html;*.htm")))
print('第二份xml檔案')
filename2 = askopenfilename(filetypes=( ("Text file", "*.xml*"),("HTML files", "*.html;*.htm")))
print('進行中,大約20來秒,處理結果在D盤diff檔案夾内')
print('處理進度')
progressbar(, )
#建立檔案夾目錄
if(os.path.exists('D:\diff')):
pass
else:
os.mkdir("D:\diff")
#xml2csv 把xml檔案轉換成csv
header = ['Name', 'InitialValue', 'BachmannAddress', 'CalibrationExpression', 'IOInitialValue']
def parse_channel(tag):
name = tag.find("Name")
initial_value = tag.find("InitialValue")
bachmann_address = tag.find("BachmannAddress")
calibration_expression = tag.find("CalibrationExpression")
io_initial_value = tag.find("IOInitialValue")
return {
"Name": name.text if name else "",
"InitialValue": initial_value.text if initial_value else "",
"BachmannAddress": bachmann_address.text if bachmann_address else "",
"CalibrationExpression": calibration_expression.text if calibration_expression else "",
"IOInitialValue": io_initial_value.text if io_initial_value else "",
}
def dump_file(data_list, file_name):
df = pd.DataFrame(data_list)
# 去除空行
df.dropna()
# 去重
df.drop_duplicates()
#df.to_csv(file_name, index=False, header=header)
df.to_csv(file_name, index=False, columns=header)
def xml2csv(input_file, output_file):
raw_text = open(input_file,'rb').read()
soup = BeautifulSoup(raw_text, "xml")
data_list = [parse_channel(i) for i in soup.find("Channels").find_all("Channel")]
dump_file(data_list=data_list, file_name=output_file)
# xml2csv(input_file="raw.xml", output_file="post.csv")
def zhaozuzhi(a,b): #a是多的那一個,b是少的
t=[]
for i in range(len(a)):
for j in b:
if a[i][]==j:
t.append([a[i]])
return t
#從三個清單中依次讀取第一個存入一行存入一個list 形成name,data1,data2的模樣
def walk_list(a,b,c):
list=[]
for i in range(len(a)):
list.append([a[i],b[i],c[i]])
return list
#将xml轉換成csv
xml2csv(input_file=filename1, output_file="D:/data1.csv")
xml2csv(input_file=filename2, output_file="D:/data2.csv")
#讀取第一個csv,生成以name名字為元素的list2
progressbar(, )
with open('D:\data1.csv','r') as f:
readers1=csv.reader(f)
list1=[row for row in readers1]
list2=[]
for i in range(len(list1)):
list2.append(list1[i][])
#讀取第二個csv,生成以name名字為元素的list4
progressbar(, )
with open('D:\data2.csv','r') as f1:
readers1=csv.reader(f1)
list3=[row for row in readers1]
list4=[]
for j in range(len(list3)):
list4.append(list3[j][])
progressbar(, )
# list2有,list4沒有,即為,data1有,data2沒有的 減少的
ret1 = [i for i in list2 if i not in list4]
# list4沒有,list2有,即為,data1沒有,data2有,增加的
ret2 = [i for i in list4 if i not in list2]
#list2有,list4也有,即為相同的部分
ret3=[i for i in list2 if i in list4]
#a11 是list1相同部分大list,b11是相同部分大list
file = open('D:\diff/ret1.txt', 'w')
for i in ret1:
file.write(str(i) +','+ '\n')
file.close()
file = open('D:\diff/ret2.txt', 'w')
for i in ret2:
file.write(str(i) +','+ '\n')
file.close()
a11=zhaozuzhi(list1,ret3)
b11=zhaozuzhi(list3,ret3)
file = open('D:\diff/temp1.txt', 'w')
for i in a11:
file.write(str(i) +','+ '\n')
file.close()
file = open('D:\diff/temp2.txt', 'w')
for i in b11:
file.write(str(i) +','+ '\n')
file.close()
lines=open('D:\diff/temp1.txt').readlines()
fp=open('D:\diff/temp1.csv', 'w')
for s in lines:
fp.write( s.replace('[[','').replace(']]','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
progressbar(, )
lines=open('D:\diff/temp2.txt').readlines()
fp=open('D:\diff/temp2.csv', 'w')
for s in lines:
fp.write( s.replace('[[','').replace(']]','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
with open('D:\diff/temp1.csv','r') as f:
readers1=csv.reader(f)
a11=[row for row in readers1]
#print(list1)
# list2=[]
# for i in range(len(list1)):
# list2.append(list1[i][0])
with open('D:\diff/temp2.csv','r') as f:
readers1=csv.reader(f)
b11=[row for row in readers1]
#print(list2)
# print(len(a11))
# print(len(b11))
#四個name,空清單,用來放找出不同的name
name1=[]
name2=[]
name3=[]
name4=[]
#寫initiavalue,形成一個txt,讀的内容不對,讀的内容應該是表以表2的相同部分
progressbar(, )
initiavalue1=[]
initiavalue2=[]
for z in range(len(a11)):
if a11[z][]!=b11[z][]:
name1.append(a11[z][])
initiavalue1.append(a11[z][])
initiavalue2.append(b11[z][])
a=walk_list(name1,initiavalue1,initiavalue2)
file = open('D:\diff/initiavalue.txt', 'w')
for i in a:
file.write(str(i) +','+ '\n')
file.close()
lines=open('D:\diff/initiavalue.txt').readlines()
fp=open('D:\diff/initiavalue.csv', 'w')
for s in lines:
fp.write( s.replace('[','').replace(']','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
##寫BachmannAddress,形成一個txt
BachmannAddress1=[]
BachmannAddress2=[]
for i in range(len(a11)):
if a11[i][]!=b11[i][]:
name2.append(str(a11[i][]))
BachmannAddress1.append(str(a11[i][]))
BachmannAddress2.append(str(b11[i][]))
b=walk_list(name2,BachmannAddress1,BachmannAddress2)
file = open('D:\diff/BachmannAddress.txt', 'w')
for i in b:
file.write(str(i) +','+ '\n')
file.close()
lines=open('D:\diff/BachmannAddress.txt').readlines()
fp=open('D:\diff/BachmannAddress.csv', 'w')
for s in lines:
fp.write( s.replace('[','').replace(']','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
# #寫CalibrationExpression,形成一個txt
CalibrationExpression1=[]
CalibrationExpression2=[]
for i in range(len(a11)):
if a11[i][]!=b11[i][]:
name3.append(str(a11[i][]))
CalibrationExpression1.append(str(a11[i][]))
CalibrationExpression2.append(str(b11[i][]))
c=walk_list(name3,CalibrationExpression1,CalibrationExpression2)
file = open('D:\diff/CalibrationExpression.txt', 'w')
for i in c:
file.write(str(i) +','+ '\n')
file.close()
lines=open('D:\diff/CalibrationExpression.txt').readlines()
fp=open('D:\diff/CalibrationExpression.csv', 'w')
for s in lines:
fp.write( s.replace('[','').replace(']','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
#寫IOInitialValue,形成一個txt
try:
IOInitialValue1=[]
IOInitialValue2=[]
for i in range(len(a11)):
if a11[i][]!=b11[i][]:
name4.append(a11[i][])
IOInitialValue1.append(str(a11[i][]))
IOInitialValue2.append(str(b11[i][]))
d=walk_list(name4,IOInitialValue1,IOInitialValue2)
file = open('D:\diff/IOInitialValue.txt', 'w')
for i in d:
file.write(str(i) +','+ '\n')
file.close()
lines=open('D:\diff/IOInitialValue.txt').readlines()
fp=open('D:\diff/IOInitialValue.csv', 'w')
for s in lines:
fp.write( s.replace('[','').replace(']','')) # replace是替換,write是寫入
fp.close() # 關閉檔案
except IndexError as e:
pass
os.remove('D:\diff/temp1.txt')
os.remove('D:\diff/temp1.csv')
os.remove('D:\diff/temp2.txt')
os.remove('D:\diff/temp2.csv')
os.remove('D:\diff/initiavalue.txt')
os.remove('D:\diff/BachmannAddress.txt')
os.remove('D:\diff/CalibrationExpression.txt')
os.remove('D:\diff/IOInitialValue.txt')
os.remove('D:/data1.csv')
os.remove('D:/data2.csv')
progressbar(,)