簡體   English   中英

使用 Python/elementtree/pandas 將 xml 轉換為 csv 時如何保留前導 0

[英]How to retain leading 0's when converting xml to csv using Python / elementtree / pandas

我正在嘗試使用 Python 將帳戶信息從大型 xml 文件轉換為 csv。 這在很大程度上是成功的,但是 Python 腳本正在從帳號中刪除前導零並將截斷的數字向右對齊。 例如,帳號 007 被裁剪為 7。帳號可以是數字、字符串或字母數字。

這是當前的腳本:

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

# Parse the XML file and find the root
xml_file = "C:\\Python Scripts\\test.xml"
csv_file = "C:\\Python Scripts\\test.csv"
xml_tree = ET.parse(xml_file)
root = xml_tree.getroot()

# Convert parsed xml file to a csv
get_range = lambda col: range(len(col))
l = [{r[i].tag:r[i].text for i in get_range(r)} for r in root]
df = pd.DataFrame.from_dict(l)
df.to_csv(csv_file)

下面是 xml 文件示例 test.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<TSAutoUpload xsi:noNamespaceSchemaLocation="tsautoup.xsd"
    xmlns:xsi="http:www.w3.org/2011/XMLSchema-instance">
    <Firm>
        <AcctNr>TEST</AcctNr>
        <LongName>TEST ACCOUNT</LongName>
    </Firm>
    <Firm>
        <AcctNr>007</AcctNr>
        <LongName>JAMES BOND INC</LongName>
    </Firm>
</TSAutoUpload>

這是 test.csv 輸出,注意前導零的截斷。 7 也向右對齊,理想情況下它應該是 007,向左對齊:

帳戶編號 長名稱
0 測試 測試賬戶
1 7 詹姆斯邦德公司

請讓我知道如何修改腳本以保留前導零而不丟失任何功能?
另外,不太重要的是,007 如何對齊到左側而不是右側?

沒有任何外部庫

import xml.etree.ElementTree as ET
import csv


xml = '''<TSAutoUpload xsi:noNamespaceSchemaLocation="tsautoup.xsd"
    xmlns:xsi="http:www.w3.org/2011/XMLSchema-instance">
    <Firm>
        <AcctNr>0087</AcctNr>
        <LongName>TEST ACCOUNT</LongName>
    </Firm>
    <Firm>
        <AcctNr>007</AcctNr>
        <LongName>JAMES BOND INC</LongName>
    </Firm>
</TSAutoUpload>'''

root = ET.fromstring(xml)
firms = [f for f in root.findall('.//Firm')]
data = [{c.tag:c.text for c in list(f)} for f in firms]

with open('out.csv','w') as f:
  csv_writer = csv.DictWriter(f, list(data[0].keys()))
  csv_writer.writeheader()
  csv_writer.writerows(data) 

輸出.csv

AcctNr,LongName
0087,TEST ACCOUNT
007,JAMES BOND INC

由於<Firm>是根節點<TSAutoUpload>的子節點,您可以遍歷根節點並將<Firm>的每個子節點的文本作為單獨的列寫入

代碼:

import xml.etree.ElementTree as ET
import csv

# Parse the XML file and find the root
xml_file = r"C:\Python Scripts\test.xml"
csv_file = r"C:\Python Scripts\test.csv"
xml_tree = ET.parse(xml_file)
root = xml_tree.getroot()

with open(csv_file, "w", newline="") as f:
    writer = csv.writer(f)
    for firm in root:
        writer.writerow(node.text for node in firm)

暫無
暫無

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

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