Table of Contents:
  1. 前言
    1. 代码概要
      1. 源码

        工具脚本-csv文件转xlsx文件

        Reading Time:The full text has 977 words, estimated reading time: 5 minutes
        Creation Date:2018-03-21
        Article Tags:
        Next Article:GoJS学习笔记
         
        BEGIN

        前言

          昨天令人惊喜, 高中同学铜钹山奇女子当年的小组长来上海了, 已经开始找工作. 想起了去年找工作时写过爬取智联招聘和拉钩的招聘信息的爬虫, 兴高采烈得从github上拉下来.配置好PostgreSQL后便跑了起来, 顺便把之前写的csv转xlsx的脚本重写了下, 感觉还不错, 把这个脚本代码贴出来供看到的读者学习, 自己以后也可以参考. 智联招聘的爬虫代码完美运行, 不过拉钩的运行报错, 有兴趣的可以拉下来研究学习.

        下载地址:

        代码概要

        此工具脚本用到了optparse、logging和xlsxwriter等模块, 可以作为一个非常棒的例子用于初学者学习.

        模块介绍:

        源码

        源码已经作了详细的说明, 这里就不重复了

        #!/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
        Next Article:GoJS学习笔记

        Random Articles
        Life Countdown
        default