xlsx批量转为utf8的csv

本文介绍了一种使用Python脚本将多个xlsx文件批量转换为UTF-8编码的CSV文件的方法,适用于游戏配置表等场景,同时保留了其他类型文件不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xlsx批量转为utf8的csv

(金庆的专栏)

策划的配置表为 xlsx 表格,可以有注释,公式。
服务器和客户端使用的配置文件需要转成 csv 文件。
使用 WPS 另存无法批量转换,并且结果不是utf8编码的,还需要用Notepad++转编码。

除了 xlsx 转为 csv, 其他格式文件保持原样,如 *.ini, *.xml, *.lua.
server/ 子目录特殊处理,不能复制到客户端。

用python脚本实现,依赖 openpyxl 库。

#!/usr/bin/env python
# coding: utf-8
# datatab.py
# 从策划配置表目录 game\Design\配置表\”
#   生成服务器的 game\Program\server\six\datatab\” 目录,
#   和客户端的 game\Program\client\Assets\Config\” 目录。
#   所有xlsx文件生成csv文件,其他文件原样复制。
#   其中 server\ 目录特殊处理,仅对服务器有效,客户端跳过。
#
# 依赖openpyxl库:http://openpyxl.readthedocs.org/en/latest/
# 参考代码 http://segmentfault.com/q/1010000003006437?_ea=273128
# 测试环境:Python3.4

# Usage: datatab.py <game dir>
# Example: datatab.py "d:\game"
# <game dir> 是根目录,包含Design/, Program/ 目录。

from openpyxl import Workbook
from openpyxl.compat import range
from openpyxl.cell import get_column_letter
from openpyxl import load_workbook
import csv
import os
import sys
import shutil

def xlsx2csv(filename):
    # try:
        xlsx_file_reader = load_workbook(filename = filename, data_only = True)
        for sheet in xlsx_file_reader.get_sheet_names():
            # 仅第1个sheet输出到一个csv文件中,文件名后缀替换为.csv
            csv_filename = os.path.splitext(filename)[0] + '.csv'
            csv_file = open(csv_filename, 'w', encoding='utf8', newline='')
            csv_file_writer = csv.writer(csv_file)
            sheet_ranges = xlsx_file_reader[sheet]
            for row in sheet_ranges.rows:
                row_container = []
                for cell in row:
                    row_container.append(cell.value)
                csv_file_writer.writerow(row_container)
            # End of for row.
            csv_file.close()
            break  # 仅输出第1个sheet
        # End of for sheet.
    # End of try.
    # except Exception as e:
    #    print(e)
# End of xlsx2csv().

def datatab_convert(game_dir):
    '''从 game\Design\配置表\ 输出到
      game\Program\server\six\datatab\
      game\Program\client\Assets\Config\
    '''
    design_dir = os.path.join(game_dir, 'Design/配置表/')
    server_dir = os.path.join(game_dir, 'Program/server/six/datatab/')
    client_dir = os.path.join(game_dir, 'Program/client/Assets/Config/')
    
    # 删除旧文件。
    print("Delete " + server_dir)
    try:
        shutil.rmtree(server_dir)
    except:
        pass
    print("Delete " + client_dir)
    try:
        shutil.rmtree(client_dir)
    except:
        pass    

    # 生成server文件
    print("Creating " + server_dir)
    shutil.copytree(design_dir, server_dir)
    files = get_files(server_dir)
    convert_files(files)
    
    # 复制client文件
    print("Copy " + client_dir)
    shutil.copytree(server_dir, client_dir)
    shutil.rmtree(os.path.join(client_dir, 'server/'))
    print("Done. Total files: %d" % len(files))
# End of datatab_convert().    

def get_files(dir):
    '''Get a list of files under input dir.'''
    result = []
    for root,dirs,files in os.walk(dir):
        for f in files:
            result.append(os.path.join(root, f))
    return result
# End of get_files().            

def convert_files(files):
    '''转换一批文件.
    files 是列表,元素为完整路径名。
    '''
    for f in files:
        ext = os.path.splitext(f)[1].lower()
        if '.xlsx' != ext:
            print(f + " -> keep")
            continue
        print(f + " -> csv")
        xlsx2csv(f)
        os.remove(f)
# End of convert_files().        

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('usage: datatab <game dir>')
    else:
        datatab_convert(sys.argv[1])
    sys.exit(0)


# Usage: datatab.py <game dir>
# Example: datatab.py "d:\game"
# <game dir> 是SVN根目录,包含Design/, Program/ 目录。

为方便使用,将datatab.py 打包成 exe, 这样不能安装Python就能运行。
下载并安装Python3, 安装openpyxl包,保证本地可以运行 datatab.py.
下载并安装PyInstaller:
    pip install pyinstaller
运行
    pyinstaller --onefile datatab.py

ImportError: No module named 'jdcal'
可能openpyxl安装时自带的jdcal无法找到,删除
C:\Python34\Lib\site-packages\jdcal-1.0-py3.4.egg
重新安装:pip install jdcal
   
<think>好的,我现在需要帮用户解决如何用Python将多个CSV文件合并并换为一个Excel文件的问题。首先,我得回忆一下相关的Python库和方法。用户提到了CSV和Excel的处理,所以肯定会用到csv模块和pandas库,可能还需要openpyxl或者xlsxwriter来支持Excel的写入。 首先,用户的需求是批量处理多个CSV文件,然后将它们合并成一个Excel文件。我需要考虑几个步骤:读取所有CSV文件、合并数据、写入Excel。可能还需要处理不同的情况,比如每个CSV文件是否对应Excel中的一个工作表,或者所有数据合并到一个工作表中。 根据引用[1]和引用[2],用户之前的示例中使用了csv模块和pandas的read_excel方法,特别是use_cols参数来选择特定列。这可能意味着用户对pandas比较熟悉,所以用pandas来处理CSV和Excel会更高效。pandas的concat函数可以合并多个DataFrame,而to_excel方法可以将数据写入Excel。 接下来,我需要确定如何遍历多个CSV文件。可以使用glob模块来匹配文件路径模式,比如所有.csv结尾的文件。然后循环读取每个CSV文件,存储到DataFrame列表中,最后合并。 用户可能还需要考虑编码问题,不同的CSV文件可能有不同的编码格式,比如utf-8或gbk,这需要在读取时指定,否则可能出现乱码。另外,处理大量数据时内存是否足够,是否需要分批处理,但用户的问题中没有提到数据量特别大,所以暂时假设数据量适中。 然后,写入Excel时,如果要将每个CSV作为单独的工作表,需要使用ExcelWriter对象,并在每次写入时指定sheet_name。如果合并到一个工作表中,则直接用concat合并所有DataFrame后再写入。用户的需求是换为“单个Excel文件”,但未说明是否多个sheet,所以可能需要两种情况都说明,或者询问用户。但根据示例中的引用[1],他们提到的是读取CSV的具体行列,可能更倾向于合并到一个工作表,但根据引用[2]中的例子,使用usecols选择列,可能更灵活。不过用户的问题中的示例代码可能更倾向于合并所有数据到一个Excel文件,可能每个CSV作为不同的sheet,或者合并成一个表。需要确认。 查看用户提供的示例中,他们的问题是关于合并多个CSV到单个Excel文件。根据常见情况,可能的两种方式:1. 所有CSV合并成一个工作表;2. 每个CSV成为Excel中的一个独立工作表。需要给出两种方法的示例代码,或者选择最常见的情况。根据引用[1]中的示例,他们读取CSV并写入Excel,可能是指每个CSV作为不同的sheet,但用户的问题中未明确,所以可能需要提供两种方法的解释和代码。 另外,引用[3]提到OmniAI可以将文档换为结构化数据,可能用户对自动化处理感兴趣,但当前问题集中在Python代码实现,所以暂时不需要涉及第三方服务,专注于本地Python库的实现。 现在考虑代码结构。首先导入必要的库:pandas和glob。使用glob获取所有CSV文件列表。然后循环读取每个CSV,添加到DataFrame列表。如果是合并到一个工作表,使用pd.concat合并所有DataFrame,然后写入Excel;如果是多个sheet,则使用ExcelWriter,逐个写入不同的sheet。 可能还需要处理文件名作为sheet名,但需要注意Excel的sheet名称限制(如长度、特殊字符等)。同时,确保文件路径正确,处理可能的异常,比如文件不存在或格式错误。但示例代码可能不需要包含错误处理,以保持简洁。 综上,给出两种方法的示例代码:一种将所有CSV合并到一个工作表,另一种每个CSV作为独立的工作表。同时,提示用户可以根据需要选择,并说明相关注意事项,如编码、内存等。 最后,根据用户的要求,生成相关问题,可能涉及性能优化、处理大型文件、指定特定列等,参考之前的引用内容来设计问题。</think>以下是通过Python批量合并多个CSV文件为单个Excel文件的完整方法及示例代码: ### 方法步骤说明 1. **读取CSV文件**:使用`pandas`库批量读取所有CSV文件 2. **合并数据**:可选择将所有数据合并到单个工作表,或每个CSV作为独立工作表 3. **输出Excel**:通过`pd.ExcelWriter`控制Excel文件格式 ### 示例代码 #### 方案1:合并到单个工作表 ```python import pandas as pd import glob # 获取所有CSV文件路径 csv_files = glob.glob('input/*.csv') # 修改为实际路径 # 读取并合并数据 all_data = [] for file in csv_files: df = pd.read_csv(file, encoding='utf-8') # 注意编码格式 all_data.append(df) merged_df = pd.concat(all_data, ignore_index=True) # 写入Excel merged_df.to_excel('output/combined.xlsx', index=False, engine='openpyxl') ``` #### 方案2:每个CSV单独工作表 ```python import pandas as pd import glob csv_files = glob.glob('input/*.csv') with pd.ExcelWriter('output/multi_sheet.xlsx', engine='openpyxl') as writer: for i, file in enumerate(csv_files): df = pd.read_csv(file) sheet_name = f"Sheet_{i+1}" # 自定义工作表名 df.to_excel(writer, sheet_name=sheet_name, index=False) ``` ### 关键参数说明 - `glob.glob()`:支持通配符匹配文件路径 - `pd.read_csv(encoding=...)`:处理中文需指定`gbk`或`gb18030` - `engine='openpyxl'`:处理xlsx格式必须参数 - `ignore_index=True`:重置合并后的索引 ### 注意事项 1. 内存管理:处理超大型文件时建议分批读取[^1] 2. 列对齐:各CSV文件列顺序/名称不一致时需预处理 3. 格式保留:使用`ExcelWriter`可添加格式控制代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值