簡體   English   中英

循環遍歷多個 xml 個文件

[英]Loop through multiple xml files

我是 python 的新手,想遍歷多個 xml 文件。 我目前正在使用現有代碼提取 sample2 xml 文件:

import xml.etree.ElementTree as ET
import pandas as pd
import os


tree=ET.parse("sample2.xml")
root = tree.getroot()

qty=root.iterfind(".//Qty")
pri=root.iterfind(".//PriceAmount")
cor=root.iterfind(".//AuctionIdentification")

data =[]
for x, y, z in zip(qty, pri, cor):
    #print(x.get("v"), y.get("v"))
    a = x.get("v"), y.get("v"), z.get("v")
    data.append(a)
    
    
df = pd.DataFrame(data, columns=["Qty", "Price" , "Border"])
df['Qty'] = df['Qty'].astype(float)
df['Price'] = df['Price'].astype(float)

#print(df)

total = df['Qty'].sum()
price = df['Price'].mean()
border = df.loc[0,'Border']

df2 = pd.DataFrame(columns=["Qty", "Price" , "Border"])

df2['Qty'] = [total]
df2['Price'] = [price]
df2['Border'] = [str(border)[0:12]]

我嘗試將 soup xml 添加到下面的代碼行,但這沒有用

tree=ET.parse("sample2.xml, "soup xml")

root = tree.getroot()

考慮將您的代碼轉換為 function 並為您需要的各種文件調用它:

import xml.etree.ElementTree as ET
import pandas as pd
import os

def my_xml_processor(filename):

   tree=ET.parse(filename)
   root = tree.getroot()

   qty=root.iterfind(".//Qty")
   pri=root.iterfind(".//PriceAmount")
   cor=root.iterfind(".//AuctionIdentification")

   data =[]
   for x, y, z in zip(qty, pri, cor):
       #print(x.get("v"), y.get("v"))
       a = x.get("v"), y.get("v"), z.get("v")
       data.append(a)
    
    
   df = pd.DataFrame(data, columns=["Qty", "Price" , "Border"])
   df['Qty'] = df['Qty'].astype(float)
   df['Price'] = df['Price'].astype(float)

   #print(df)

   total = df['Qty'].sum()
   price = df['Price'].mean()
   border = df.loc[0,'Border']

   df2 = pd.DataFrame(columns=["Qty", "Price" , "Border"])

   df2['Qty'] = [total]
   df2['Price'] = [price]
   df2['Border'] = [str(border)[0:12]]

   return df2

然后你可以為你的文件調用它:

my_xml_processor("sample2.xml")

my_xml_processor("soup.xml")

編輯:這些是我推薦的一些小代碼更改:

import xml.etree.ElementTree as ET
import pandas as pd
import os

def my_xml_processor(filename:str)->pd.DataFrame: # <- Add type hints

   root = ET.parse(filename).getroot() # <- tree is not used

   qty = root.iterfind(".//Qty")
   pri = root.iterfind(".//PriceAmount")
   cor = root.iterfind(".//AuctionIdentification")

   data = [ # <- This could be a list comprehension
     (x.get('v'), y.get('v'), z.get('v')) 
     for x,y,z in zip(qty, pri, cor)
    ]
    
   df = (pd
         .DataFrame(data, columns=["Qty", "Price" , "Border"])
         .astype({
            'Qty': float, 
            'Price': float, 
          })
         )
   
   df2 = df.agg({
        'Qty':'sum', 
        'Price':'mean',
        'Border': lambda x: str(x[0])[:12]
    }).to_frame().T


   return df2

您可以使用您現有的代碼,但為您擁有的每個文件名循環運行它,例如:


import xml.etree.ElementTree as ET
import pandas as pd
import os


files = ['sample2.xml', 'sample3.xml', 'sample4.xml']

for file in files: #read each filename from above list
    tree=ET.parse(file)
    root = tree.getroot()

    qty=root.iterfind(".//Qty")
    pri=root.iterfind(".//PriceAmount")
    cor=root.iterfind(".//AuctionIdentification")

    data =[]
    for x, y, z in zip(qty, pri, cor):
        #print(x.get("v"), y.get("v"))
        a = x.get("v"), y.get("v"), z.get("v")
        data.append(a)
        
        
    df = pd.DataFrame(data, columns=["Qty", "Price" , "Border"])
    df['Qty'] = df['Qty'].astype(float)
    df['Price'] = df['Price'].astype(float)

    #print(df)

    total = df['Qty'].sum()
    price = df['Price'].mean()
    border = df.loc[0,'Border']

    df2 = pd.DataFrame(columns=["Qty", "Price" , "Border"])

    df2['Qty'] = [total]
    df2['Price'] = [price]
    df2['Border'] = [str(border)[0:12]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM