文字脚本自动生成
This commit is contained in:
104
wenzijiaoben/py/xlsx_to_csv.py
Normal file
104
wenzijiaoben/py/xlsx_to_csv.py
Normal file
@@ -0,0 +1,104 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user