在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求。这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就论占用内存来说,同样的数据量Excel表格所占用的内存要远远大于CSV,因此将Excel转换成CSV势在必行。如果单单转换一个Excel表格还好,直接另存为就搞定的,但是如何将一个文件下的N个Execl表格转成CSV呢?今天马三就来和大家一起用Python撸一个Excel表格批量转换CSV的小工具——Xls2CSV。
马三在网上找到了一些现有的Excel批量转换小工具,但是他们或多或少都有些不甚好用,里面的注释又不全。马三在它们的基础上进行了优化,支持自定义输入输出路径,解决了中文乱码的问题,并且添加了较为全面的注释。下面先简单介绍一下开发环境:
图1:xlrd源码包下载
开发环境准备好之后,我们就可以进行开发工作了。首先还是上一下整体的代码,然后在解释一下它的工作思路:
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 = "\n"
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("\r\n").split(',')
24 global IN_PATH
25 IN_PATH = cur_line[1]
26 cur_line = config_file.readline().rstrip("\r\n").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 # 筛选出xlsx\xls文件
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()
转表工具的工作思路如下:
具体每块函数和代码的作用,已经在注释里面写清了,直接看注释就好。
工具开发完了,如何使用呢?其实它使用起来很简单,只需两步操作:
图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 请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!