105 lines
3.1 KiB
Python
105 lines
3.1 KiB
Python
"""
|
||
xlsx转csv工具
|
||
- 将指定目录下所有.xlsx文件转换为.csv格式
|
||
- 输出路径:D:\15CVS
|
||
- 只处理每个xlsx文件的第一个工作表(主数据表)
|
||
- 忽略以~$开头的临时文件
|
||
- CSV编码:UTF-8 with BOM
|
||
- 避免覆盖同名文件(如已存在则跳过并提示)
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import csv
|
||
import glob
|
||
from openpyxl import load_workbook
|
||
|
||
|
||
def xlsx_to_csv(src_dir, out_dir):
|
||
"""将源目录下所有xlsx文件转换为csv格式"""
|
||
# 确保输出目录存在
|
||
os.makedirs(out_dir, exist_ok=True)
|
||
|
||
# 统计计数
|
||
success_count = 0
|
||
skip_count = 0
|
||
fail_count = 0
|
||
|
||
# 遍历源目录下所有xlsx文件(不递归子目录)
|
||
xlsx_files = glob.glob(os.path.join(src_dir, "*.xlsx"))
|
||
|
||
for xlsx_path in xlsx_files:
|
||
filename = os.path.basename(xlsx_path)
|
||
|
||
# 跳过以~$开头的临时文件
|
||
if filename.startswith("~$"):
|
||
print(f"[跳过] 临时文件: {filename}")
|
||
skip_count += 1
|
||
continue
|
||
|
||
csv_filename = os.path.splitext(filename)[0] + ".csv"
|
||
csv_path = os.path.join(out_dir, csv_filename)
|
||
|
||
# 检查目标文件是否已存在
|
||
if os.path.exists(csv_path):
|
||
print(f"[跳过] 文件已存在: {csv_filename}")
|
||
skip_count += 1
|
||
continue
|
||
|
||
try:
|
||
print(f"[转换] {filename} -> {csv_filename}", end=" ... ")
|
||
|
||
# 读取xlsx文件(只读模式,提高性能)
|
||
wb = load_workbook(xlsx_path, read_only=True, data_only=True)
|
||
ws = wb.active # 获取第一个工作表
|
||
|
||
# 写入CSV文件
|
||
with open(csv_path, "w", newline="", encoding="utf-8-sig") as f:
|
||
writer = csv.writer(f)
|
||
|
||
for row in ws.iter_rows(values_only=True):
|
||
# 将None转为空字符串,其他值保持原样
|
||
csv_row = [cell if cell is not None else "" for cell in row]
|
||
writer.writerow(csv_row)
|
||
|
||
wb.close()
|
||
print("成功")
|
||
success_count += 1
|
||
|
||
except Exception as e:
|
||
print(f"失败")
|
||
print(f" [错误] {filename}: {e}")
|
||
fail_count += 1
|
||
# 清理可能生成的不完整文件
|
||
if os.path.exists(csv_path):
|
||
try:
|
||
os.remove(csv_path)
|
||
except Exception:
|
||
pass
|
||
|
||
# 打印统计结果
|
||
print("\n" + "=" * 50)
|
||
print(f"转换完成!")
|
||
print(f" 成功: {success_count} 个")
|
||
print(f" 跳过: {skip_count} 个")
|
||
print(f" 失败: {fail_count} 个")
|
||
print(f" 总计: {success_count + skip_count + fail_count} 个")
|
||
print("=" * 50)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
src_dir = r"d:\A工作\P-L15_config"
|
||
out_dir = r"D:\15CVS"
|
||
|
||
# 支持命令行参数修改源目录
|
||
if len(sys.argv) > 1:
|
||
src_dir = sys.argv[1]
|
||
if len(sys.argv) > 2:
|
||
out_dir = sys.argv[2]
|
||
|
||
print(f"源目录: {src_dir}")
|
||
print(f"输出目录: {out_dir}")
|
||
print("-" * 50)
|
||
|
||
xlsx_to_csv(src_dir, out_dir)
|