zoukankan      html  css  js  c++  java
  • 【游戏开发】Excel表格批量转换成CSV的小工具

    一、前言

      在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求。这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就论占用内存来说,同样的数据量Excel表格所占用的内存要远远大于CSV,因此将Excel转换成CSV势在必行。如果单单转换一个Excel表格还好,直接另存为就搞定的,但是如何将一个文件下的N个Execl表格转成CSV呢?今天马三就来和大家一起用Python撸一个Excel表格批量转换CSV的小工具——Xls2CSV。

    二、准备开发环境

      马三在网上找到了一些现有的Excel批量转换小工具,但是他们或多或少都有些不甚好用,里面的注释又不全。马三在它们的基础上进行了优化,支持自定义输入输出路径,解决了中文乱码的问题,并且添加了较为全面的注释。下面先简单介绍一下开发环境:

    • 转化工具由Python2.7.x开发,依赖xlrd包(用于处理Excel表格)
    • 首先安装Python2.7.x并配置环境变量,这不必多说,网上有很多教程
    • 然后安装我们的依赖包xlrd,到https://pypi.python.org/pypi/xlrd 下载xlrd源码包到本地,如图1所示
    • 在解压后的源码包内执行 python setup.py install ,安装xlrd模块
    • 重启命令行即可生效

      

      图1:xlrd源码包下载

    三、Xls2CSV脚本开发  

      开发环境准备好之后,我们就可以进行开发工作了。首先还是上一下整体的代码,然后在解释一下它的工作思路:

      1 # -*- coding: utf-8 -*-  
      2 
      3 import os,sys,inspect,re
      4 import xdrlib,xlrd
      5 
      6 # 防止中文乱码
      7 reload(sys)
      8 sys.setdefaultencoding("utf-8")
      9 
     10 # 分割符
     11 C_SPACE = ","
     12 # 结束符
     13 C_END = "
    "
     14 # 输入路径(存放xls文件的路径)
     15 IN_PATH = ""
     16 # 输出路径(导出csv文件的路径)
     17 OUT_PATH = ""
     18 
     19 
     20 # 读取配置文件
     21 def read_config():
     22     config_file = open("config.ini","r")
     23     cur_line = config_file.readline().rstrip("
    ").split(',')
     24     global IN_PATH 
     25     IN_PATH = cur_line[1]
     26     cur_line = config_file.readline().rstrip("
    ").split(',')
     27     global OUT_PATH 
     28     OUT_PATH = cur_line[1]
     29 
     30 # 过滤路径
     31 def cur_file_dir(path):
     32     if os.path.isfile(path):
     33         path = os.path.dirname(path)
     34     print path
     35     return os.path.abspath(path)
     36 
     37 # 搜索指定文件夹下面的文件
     38 def find_file_by_pattern(pattern='.*', base=".", circle=True):  
     39     # 查找给定文件夹下面所有xls文件
     40     re_file = re.compile(pattern)
     41     # 第一次搜索的时候过滤下路径,递归之后直接搜索base路径即可
     42     if base == ".":
     43         base = cur_file_dir(IN_PATH)
     44     print u"开始搜索文件夹:",base
     45 
     46     # 存储xls文件的列表
     47     final_file_list = []
     48     # 遍历指定路径下的文件
     49     cur_list = os.listdir(base)  
     50     for item in cur_list:
     51         # 忽略一些干扰的文件,如果你还有其他需要忽略的文件,直接在后面继续添加即可
     52         if item == ".svn":
     53             continue
     54         # 拼接路径
     55         full_path = os.path.join(base, item)
     56         # 忽略临时文件
     57         if full_path.startswith("~"):
     58             continue
     59         # 筛选出xlsxxls文件
     60         if full_path.endswith(".xlsx") or full_path.endswith(".xls"):
     61             print u"输入文件:" + full_path
     62             bfile = os.path.isfile(item)
     63             if os.path.isfile(full_path):
     64                 if re_file.search(full_path):
     65                     final_file_list.append(full_path)  
     66             else:
     67                 final_file_list += find_file_by_pattern(pattern, full_path)
     68 
     69     # 返回文件列表
     70     return final_file_list
     71 
     72 
     73 # 打开excel
     74 def open_excel(file= 'file.xls'):
     75     try:
     76         data = xlrd.open_workbook(file)
     77         return data
     78     except Exception,e:
     79         print str(e)
     80 
     81 
     82 #根据索引获取Excel表格中的数据 参数:file:Excel文件路径, colnameindex:表头列名所在行的索引, by_index:表的索引
     83 def excel_table_byindex(file='file.xls', colnameindex=0, by_index=0):
     84     data = open_excel(file)
     85     table = data.sheets()[by_index]
     86     nrows = table.nrows #行数
     87     ncols = table.ncols #列数
     88     rowlist = []
     89     
     90     '''开始读取数据'''
     91     for rownum in range(colnameindex, nrows):
     92         rowdata = table.row_values(rownum)
     93         if rowdata:
     94             collist = []
     95             for i in range(ncols):
     96                 collist.append(rowdata[i])
     97             rowlist.append(collist)
     98     return rowlist
     99 
    100 #保存csv文件
    101 def savaToCSV(_file, _list, _path):
    102     filename = ""
    103     content = ""
    104     #生成文件内容
    105     for collist in _list:
    106         for i in range(len(collist)):
    107             v = collist[i]
    108             vstr = ""
    109             # print k,v
    110             if isinstance(v, float) or isinstance(v, int):
    111                 vstr = str(int(v))
    112             else:
    113                 vstr = v
    114             if i > 0:
    115                 content = content + C_SPACE
    116             content = content + vstr
    117         content = content + C_END
    118 
    119     #生成文件后缀 
    120     fname = os.path.basename(_file).split('.')
    121     filename = fname[0] + ".csv"
    122 
    123     #写文件
    124     if len(filename)>0 and len(content)>0:
    125         filename = OUT_PATH + "/" + filename
    126         print u"输出文件:" + filename
    127         file_object = open(filename, 'w')
    128         file_object.write(content)
    129         file_object.close()
    130 
    131 
    132 def main():
    133 
    134     read_config()
    135     filelist = find_file_by_pattern()
    136     if len(filelist) > 0:
    137         path = ""
    138         #遍历文件生成csv
    139         for file in filelist:
    140             datalist = excel_table_byindex(file, 0)
    141             if len(datalist)>0:
    142                 savaToCSV(file, datalist, path)
    143     else:
    144         print u"没有找到任何excel文件!"
    145 
    146 if __name__=="__main__":
    147     main()
    View Code

      转表工具的工作思路如下:

    • 首先,从配置文件中读取到输入路径和输出路径
    • 接着,过滤路径,并在输入路径下执行搜索,如果是xls文件的话,则把其路径+文件名加入一个filelist列表中保存待用;如果是其他文件,则跳过;如果是目录的话,则对该目录也进行相同的搜索(即递归调用搜索函数)
    • 然后,遍历之前保存的filelist列表,取出xls文件的路径,然后利用xlrd模块打开Excel表格,并提取其中的信息
    • 最后,根据之前的xls文件名,创建出对应的输出路径(输出路径+Execl文件名.csv),然后将读取出的数据,逐行写入CSV文件并保存

      具体每块函数和代码的作用,已经在注释里面写清了,直接看注释就好。

    四、Xls2CSV工具的使用

      工具开发完了,如何使用呢?其实它使用起来很简单,只需两步操作:

    • 打开 config.ini 配置文件,配置输入路径以及输出路径,将路径替换成自己的就好 ,如图2所示
    • 执行 xlsx2csv.py 脚本进行自动导表,这一步最好在命令行下执行脚本,这样如果有报错信息的话也可以直观地看到。如果双击执行的话,很有可能一闪而过,脚本报错了也不知道

      

      图2:配置输入输出路径

    五、其他优秀的转表工具   

      上面我们写的Excel批量转换工具其实还是太简陋了,tolua的开发者已经为广大的Unity开发人员制作了一款可以将Excel表格数据导出为Lua table、csv、json形式的工具,兼带数据检查功能以及导出、导入MySQL数据库功能。除此之外,还支持GUI界面等很多实用的功能,大家感兴趣的话可以到Github去查看该项目的具体内容:https://github.com/zhangqi-ulua/XlsxToLua

    六、总结

      通过本篇博客,我们一起学习了如何使用Python制作一款批量转换Excel表格为CSV文件的小工具,从而提升我们的工作效率。因为本工具并没有经过大量项目和数据的测试,所以很有可能存在未知的bug,因此如果大家在商业项目中应用的话,最好还是使用上面所说的成熟的tolua中的转表工具,会更稳定一些。本篇博客只是为大家抛砖引玉,提供一种Excel批量转换的思路。

      本篇博客中的所有代码已经托管到Github,开源地址:https://github.com/XINCGer/Unity3DTraining/tree/master/XlsxTools/xls2csv  欢迎fork!

    作者:马三小伙儿
    出处:http://www.cnblogs.com/msxh/p/7858346.html
    请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

  • 相关阅读:
    (转) 网络游戏程序员须知 基础概念篇(游戏同步)
    (转) 网络游戏实时动作同步方案手记
    (转)Unity3d中的碰撞检测
    在Hadoop1.2.1上运行第一个Hadoop程序FileSystemCat
    shell小工具查看Hadoop中System.out输出的日志
    配置Hadoop1.2.1
    Linux下出现command not found的解决办法
    hadoop在子节点上没有datanode进程
    Hadoop常用命令
    hadoop下载地址
  • 原文地址:https://www.cnblogs.com/msxh/p/7858346.html
Copyright © 2011-2022 走看看