[英]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.