工具脚本-csv文件转xlsx文件
阅读时间:全文 977 字,预估用时 5 分钟
创作日期:2018-03-21
下篇文章:GoJS学习笔记
BEGIN
前言
昨天令人惊喜, 高中同学铜钹山奇女子当年的小组长来上海了, 已经开始找工作. 想起了去年找工作时写过爬取智联招聘和拉钩的招聘信息的爬虫, 兴高采烈得从github上拉下来.配置好PostgreSQL后便跑了起来, 顺便把之前写的csv转xlsx的脚本重写了下, 感觉还不错, 把这个脚本代码贴出来供看到的读者学习, 自己以后也可以参考. 智联招聘的爬虫代码完美运行, 不过拉钩的运行报错, 有兴趣的可以拉下来研究学习.
下载地址:
代码概要
此工具脚本用到了optparse、logging和xlsxwriter等模块, 可以作为一个非常棒的例子用于初学者学习.
模块介绍:
- optparse 🔗: 用于脚本执行时命令参数获取
- logging 🔗: 用于日志输出
- xlsxwriter 🔗: 用于构建xlsx文件并写入数据
源码
源码已经作了详细的说明, 这里就不重复了
#!/usr/bin/python2.7
# coding:utf-8
"""一个实用的csv文件转xlsx文件的脚本, 方法简单, 核心代码少, 但五脏俱全.
适合用于模块optparse、logging和xlsxwriter的学习, 是很好的实例.
By Rnet-Ao <it17621000@163.com>
简单的实例:
python csv2xlsx.py -f /path/from/ -d '$' -s -o /path/to/
Options:
-h, --help show this help message and exit
-f FILE, --filepath=FILE
需要转换的csv源文件文件路径, 默认为当前路径
-d DELIMITER, --delimiter=DELIMITER
指定csv文件的数据分隔符, 默认为逗号(,)
-t FILETYPE, --typename=FILETYPE
指定文件类型(后缀), 默认为csv
-s 是否子目录中文件也执行转换
-o PATH, --outpath=PATH
转化后文件保存的目录, 默认为当前路径下的files目录
此脚本为个人原创, 转载请注明头排的出处及说明部分, 非常感谢!
"""
import os
import sys
import xlsxwriter
import logging
from optparse import OptionParser
reload(sys)
sys.setdefaultencoding('utf8')
class Handler:
"""
参数说明:
filepath: 文件路径或目录
delimiter: 文件分割符
filetype: 文件类型
subdir: 是否递归处理子目录
outpath: 转换后文件保存目录
"""
def __init__(self, options):
self._setlog()
self.filepath = options.filepath
self.delimiter = options.delimiter
self.filetype = options.filetype
self.subdir = options.subdir
self.outpath = options.outpath
self._checks()
def _setlog(self):
"""日志功能初始化"""
logger = logging.getLogger('tip')
logger.setLevel(logging.getLevelName('INFO'))
loghd = logging.StreamHandler()
loghd.setFormatter(logging.Formatter(
'[%(asctime)s] %(name)s:%(levelname)s: %(message)s'))
logger.addHandler(loghd)
self.logger = logger
def _checks(self):
"""初始前的检查"""
if not os.path.isdir(self.outpath):
os.makedirs(self.outpath)
tip = ('\n配置信息:'
'\n\t文件路径: %s'
'\n\t分隔符: %s'
'\n\t文件类型: %s'
'\n\t是否遍历子目录: %s'
'\n\t输出目录: %s')
self.logger.info(tip % (self.filepath, self.delimiter, self.filetype,
self.subdir, self.outpath))
def transform(self, file_path, file_name):
"""
转换方法, 用于将文件转换成xlsx文件
假设源csv文件路径为: /path/to/oragin.csv
则传入:
file_path = /path/to
file_name = oragin.csv
"""
nameora = os.path.splitext(file_name)[0].decode('utf-8')
pathsmall = file_path.replace(self.filepath, '')\
.strip(os.sep).replace(os.sep, '-')
name = '-'.join([nameora, pathsmall]) if pathsmall != '' else nameora
out_name = os.path.join(self.outpath, name) + '.xlsx'
xf = xlsxwriter.Workbook(out_name)
sheet1 = xf.add_worksheet(nameora)
self.logger.info('转换文件: %s ----> %s' % (
os.path.join(file_path, file_name), out_name
))
with open(os.path.join(file_path, file_name)) as f:
for index, line in enumerate(f):
line = line.decode('utf-8')
a_txt = line[0:len(line)-1].split(self.filetype)
for i in range(0, len(a_txt)):
sheet1.write(index, i, a_txt[i])
def deeptrans(self, rootdir):
"""
传入目录, 并对目录下文件及目录进行处理
若self.subdir值为True时则递归转换子目录下对应的文件
"""
for parent, fdirs, filers in os.walk(rootdir):
if not self.subdir \
and parent.strip(os.sep) != self.filepath.strip(os.sep):
return;
for filer in filers:
if os.path.splitext(filer)[1][1:] == self.filetype:
self.transform(parent, filer)
def run(self):
"""入口方法"""
if os.path.isdir(self.filepath):
self.deeptrans(self.filepath)
elif os.path.isfile(self.filepath):
(file_path, file_name) = os.path.split(self.filepath)
self.transform(file_path, file_name)
else:
self.logger.error('路径不存在请检查')
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-f", "--filepath", dest="filepath",
help="需要转换的csv源文件文件路径, 默认为当前路径",
metavar="FILE", default=os.getcwd())
parser.add_option("-d", "--delimiter", dest="delimiter",
help="指定csv文件的数据分隔符, 默认为逗号(,)",
metavar="DELIMITER", default=',')
parser.add_option("-t", "--typename", dest="filetype",
help="指定文件类型(后缀), 默认为csv",
metavar="FILETYPE", default='csv')
parser.add_option("-s", action="store_true", dest="subdir", default=False,
help="是否子目录中文件也执行转换")
parser.add_option("-o", "--outpath", dest="outpath", metavar="PATH",
help="转化后文件保存的目录, 默认为当前路径下的files目录",
default=os.path.join(os.getcwd(), 'files'))
(options, args) = parser.parse_args()
handler = Handler(options)
handler.run()
FINISH
下篇文章:GoJS学习笔记