翻譯|行業資訊|編輯:吉煒煒|2025-10-27 10:39:22.293|閱讀 53 次
概述:在本指南中,我們將探討如何使用 Spire.XLS for Python 將 CSV 文件轉換為 XML。你將學習如何將 CSV 轉換為 Excel XML 格式以及 標準 XML 。同時,我們還將介紹如何清理和預處理真實世界中的 CSV 文件——處理無效表頭、缺失值、特殊字符和嵌套字段等問題,以確保生成的 XML 輸出始終有效且結構正確。
#慧都22周年慶大促·界面/圖表報表/文檔/IDE/IOT/測試等千款熱門軟控件火熱促銷中>>
相關鏈接:
CSV 因其簡潔和跨平臺的廣泛支持,是最常見的表格數據交換格式之一。然而,當需要處理結構化應用程序、配置文件或層次化數據時,XML 通常成為首選格式,因為它能夠表示嵌套關系并提供更嚴格的數據驗證。
在本指南中,我們將探討如何使用 Spire.XLS for Python 將 CSV 文件轉換為 XML。你將學習如何將 CSV 轉換為 Excel XML 格式以及 標準 XML 。同時,我們還將介紹如何清理和預處理真實世界中的 CSV 文件——處理無效表頭、缺失值、特殊字符和嵌套字段等問題,以確保生成的 XML 輸出始終有效且結構正確。
歡迎加入Spire技術交流Q群(125237868),與更多小伙伴一起提升文檔開發技能~
為什么開發者需要將 CSV 轉 XML 呢?以下是一些實際應用場景:
CSV 以簡潔取勝,XML 以結構見長。通過兩者的互相轉換,你可以兼得兩種格式的優勢。
在開始編寫代碼之前,請確保準備好以下環境:
通過 pip 安裝 Spire.XLS(假設系統中已安裝 Python 和 pip):
pip install spire.xls此外,請準備一個測試用 CSV 文件,例如:
員工ID,姓名,部門,職位,入職日期,薪資 1001,張三,技術部,軟件工程師,2021-03-15,15000 1002,李四,市場部,市場專員,2022-07-01,12000 1003,王五,技術部,產品經理,2020-11-10,18000 1004,趙六,人力資源部,招聘經理,2019-05-22,14000
第一種方法是將 CSV 轉換為 Excel 兼容的 XML 格式,也稱為 SpreadsheetML (Excel 2003 引入)。這種格式可以被 Excel 直接打開。
使用 Spire.XLS,這一過程非常簡單:
from spire.xls import *
# 創建 Workbook
workbook = Workbook()
# 加載 CSV 文件
workbook.LoadFromFile("input.csv", ",", 1, 1)
# 保存為 Excel XML格式
workbook.SaveAsXml("output.xml")
# 釋放資源
workbook.Dispose()
工作原理 效果圖 :
更多時候,你可能需要如下所示標準的XML 結構,而不是 Excel 兼容格式:
<Employee> <employee_id>1001</employee_id> <name>張三</name> <department>技術部</department> <position>軟件工程師</position> <hire_date>2021-03-15</hire_date> <salary>15000</salary> </Employee>實現方式如下:
from spire.xls import *
import xml.etree.ElementTree as ET
from xml.dom import minidom
def chinese_to_english_tag(chinese_header):
"""
將特定的中文列名轉換為英文XML標簽
"""
mapping = {
'員工ID': 'employee_id',
'姓名': 'name',
'部門': 'department',
'職位': 'position',
'入職日期': 'hire_date',
'薪資': 'salary'
}
# 去除前后空格后查找映射
cleaned_header = chinese_header.strip()
return mapping.get(cleaned_header, cleaned_header)
# Step 1: 加載 CSV 文件
workbook = Workbook()
workbook.LoadFromFile(r"C:\Users\Administrator\Desktop\input.csv", ",", 1, 1)
sheet = workbook.Worksheets[0]
# Step 2: 創建根節點
root = ET.Element("Employees")
# Step 3: 處理表頭 - 中文列名轉英文
headers = []
for col in range(1, sheet.Columns.Count + 1):
cell_value = sheet.Range[1, col].Value
if not cell_value:
break
english_tag = chinese_to_english_tag(str(cell_value))
headers.append(english_tag)
# Step 4: 添加數據行
for row in range(2, sheet.Rows.Count + 1):
if not sheet.Range[row, 1].Value:
break
employee = ET.SubElement(root, "Employee")
for col, english_header in enumerate(headers, start=1):
cell_value = sheet.Range[row, col].Value
field = ET.SubElement(employee, english_header)
field.text = str(cell_value) if cell_value is not None else ""
# Step 5: 保存為格式化的 XML 文件
xml_str = ET.tostring(root, encoding='utf-8')
pretty_xml = minidom.parseString(xml_str).toprettyxml(indent=" ")
with open("output/standard.xml", 'w', encoding='utf-8') as f:
f.write(pretty_xml)
# 釋放資源
workbook.Dispose()
工作原理 效果圖 :
將“完美”的 CSV 轉換為 XML 很容易,但實際 CSV 往往并不理想。以下是常見問題及對應解決方案:
OrderID,Customer,Products 1001,張三,"電腦;鼠標;鍵盤"若直接轉換,將丟失層次結構。
<Products> <Product>電腦</Product> <Product>鼠標</Product> <Product>鍵盤</Product> </Products>中文列名轉換為英文
可使用以下輔助函數自動預處理 CSV (不包含中文列名轉換為英文):
import csv
import re
def clean_csv(input_file, output_file, nested_columns=None, nested_delimiter=";"):
if nested_columns is None:
nested_columns = []
cleaned_rows = []
# 轉義 XML 特殊字符
def escape_xml(text):
return (text.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace('"', """)
.replace("'", "'"))
with open(input_file, "r", encoding="utf-8") as infile:
reader = csv.reader(infile)
headers = next(reader)
# 清理表頭
cleaned_headers = []
for h in headers:
h = h.strip() # 去除首尾空格
h = re.sub(r"\s+", "_", h) # 將空格替換為下劃線
h = re.sub(r"[^a-zA-Z0-9_]", "", h) # 移除非法字符
if re.match(r"^\d", h): # 若表頭以數字開頭,則加前綴
h = "Field_" + h
cleaned_headers.append(h)
cleaned_rows.append(cleaned_headers)
# 讀取所有行數據
raw_rows = []
for row in reader:
# 將空單元格替換為 "NULL"
row = [cell if cell.strip() != "" else "NULL" for cell in row]
raw_rows.append(row)
# 處理嵌套列(如多值列)
if nested_columns:
expanded_rows = [cleaned_headers] # 保留表頭
for row in raw_rows:
row_variants = [row]
for col_name in nested_columns:
if col_name not in cleaned_headers:
continue
col_index = cleaned_headers.index(col_name)
temp = []
for variant in row_variants:
cell_value = variant[col_index]
# 僅按嵌套分隔符拆分,不影響 XML 特殊字符
if nested_delimiter in cell_value:
items = [item.strip() for item in cell_value.split(nested_delimiter)]
for item in items:
new_variant = variant.copy()
new_variant[col_index] = item
temp.append(new_variant)
else:
temp.append(variant)
row_variants = temp
expanded_rows.extend(row_variants)
cleaned_rows = expanded_rows
else:
cleaned_rows.extend(raw_rows)
# 展開后再轉義特殊字符
final_rows = [cleaned_rows[0]] # 保留表頭
for row in cleaned_rows[1:]:
final_row = [escape_xml(cell) for cell in row]
final_rows.append(final_row)
# 寫入清理后的 CSV 文件
with open(output_file, "w", newline="", encoding="utf-8") as outfile:
writer = csv.writer(outfile)
writer.writerows(final_rows)
print(f"清理后的 CSV 已保存至 {output_file}")
你可以通過傳入輸入和輸出 CSV 文件路徑來調用 clean_csv 函數,并可選地指定需要展開嵌套值的列。
# 文件路徑 input_file = r"C:\Users\Administrator\Desktop\input.csv" output_file = r"C:\Users\Administrator\Desktop\cleaned_output.csv" # 指定可能包含嵌套值的列 nested_columns = ["Products"] # 你也可以添加更多,例如 ["Products", "Reviews"] # 調用 clean_csv 函數 clean_csv(input_file, output_file, nested_columns=nested_columns, nested_delimiter=";")該函數可確保 CSV 在轉換為 XML 前干凈、有效,功能包括:
使用 Spire.XLS for Python 將 CSV 轉換為 XML,不僅高效,而且具備極強的靈活性。無論是快速導出、結構化集成,還是復雜的業務數據轉換,都能輕松應對。
從企業系統集成、報表歸檔,到舊系統的數據遷移,這一流程充分結合了 CSV 的簡潔性 與 XML 的結構化優勢 ,為數據交換與自動化處理提供了穩健、高可維護的解決方案。
可以,但建議采用流式處理(逐行處理)以避免內存問題。
支持。保存為 Excel XML 是內置功能,但自定義 XML 仍需代碼實現。
可使用 escape_xml 輔助函數或 Python 內置的 xml.sax.saxutils.escape()。
調用 clean_csv 時,可在 nested_columns 參數中傳入多個列名。
可以。生成 XML 后,可根據 XSD 模式進行驗證。
————————————————————————————————————————
關于慧都科技:
慧都科技是一家行業數字化解決方案公司,長期專注于軟件、油氣與制造行業。公司基于深入的業務理解與管理洞察,以系統化的業務建模驅動技術落地,幫助企業實現智能化運營與長期競爭優勢。在軟件工程領域,我們提供開發控件、研發管理、代碼開發、部署運維等軟件開發全鏈路所需的產品,提供正版授權采購、技術選型、個性化維保等服務,幫助客戶實現技術合規、降本增效與風險可控。慧都科技E-iceblue的官方授權代理商,提供E-iceblue系列產品免費試用,咨詢,正版銷售等于一體的專業化服務。E-iceblue旗下Spire系列產品是國產文檔處理領域的優秀產品,支持國產化,幫助企業高效構建文檔處理的應用程序。
歡迎下載|體驗更多E-iceblue產品
獲取更多信息請咨詢 ;技術交流Q群(125237868)
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網