使用python开发json、csv数据格式转换工具


  • json和xml是业界常用的数据格式,而游戏行业经常使用csv配表,包括本地化文本和数值。本文介绍csv和json序列化、逆序列化相关的python库,以及开发工具常用的命令行解析库--getopt

csv模块

  • csv文件格式并不统一,存在多种分隔符,而csv模块可以很方便的读写csv文件
  • csv.reader
    • 返回一个reader迭代器,迭代器每次给出一个字符串列表,对应于csv文件中的一行
  • csv.writer
    • 相应的,返回一个writer,调用writerrow([stra,strb,...strc])可以将数据写入文件
  • csv.DictReader
    • 创建一个DictReader类,对比reader迭代器,每次迭代给出一个字典对应一行,参数Reader.fieldnames给出了字典的key
  • csv.DictWriter
    • 类似writer,但输出的是字典

json模块

  • dump(obj, fp)将对象序列化后写入文件fp,indent选项可格式化json文件
  • dumps(obj)返回obj序列化之后的字符串
  • load(fp)从文件对象fp中反序列化,支持str或unicode
  • loads(s)从字符串中反序列化

getopt解析命令行

  • getopt模块在c语言中也有,python实现了同样功能的模块
  • 与sys模块配合,获取命令行参数
    • sys.argv为命令行列表
    • sys.argv[1:]可传递给getopt使用,去除了第一个参数(脚本名)
  • getopt.getopt(sys,argv[1:], options[, long_options])
    • options为短选项,例如hi:,表示可以-h或者-i xxx的方式使用,:表示该选项必须附加参数
    • long_options为长选项,例如['help', 'input='],可以--help或者--input xxx的格式使用,=表示该选项必须附加参数
    • 第一个返回值为(option, value)的pair列表,第二个返回值为解析后剩余的参数
    • 例如命令行参数为-h -i xxx yyy,则返回值为[('-h', ''), ('-i', xxx)], ['yyy']
    • 获得pair列表后,根据其中的数据进行不同的操作

csv转换为json文件工具举例

  • 下面为csv文件转换为json的样例代码,以csv第一列作为json dict的key

    import sys, getopt
    import csv
    import json
    from ast import literal_eval
    
    def main(argv):
        pretty = False
        try:
            opts, args = getopt.getopt(argv,"hp")
        except getopt.GetoptError:
            print 'test.py [-p]'
            sys.exit(2)
        for opt, arg in opts:
            if opt == '-h':
                print 'test.py [-p]'
                sys.exit()
            elif opt == '-p':
                pretty = True
    
        data = read_csv("test.csv")
        #print(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '),encoding="utf-8",ensure_ascii=False))
        write_json(data, "test.json", pretty)
    
    
    def read_csv(file):
        csv_rows = {}
    
        def format(source):
            try:
                source = literal_eval(source)
            except:
                pass
            finally:
                return source
    
        with open(file) as csvfile:
            reader = csv.DictReader(csvfile)
            title = reader.fieldnames
            for row in reader:
                csv_rows[format(row[title[0]])] = {title[i]:format(row[title[i]]) for i in range(len(title)) if not title[i].startswith('_')}
    
        return csv_rows
    
    
    def write_json(data, json_file, format = True):
        with open(json_file, "w") as f:
            if format:
                f.write(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '),encoding="utf-8",ensure_ascii=False))
            else:
                f.write(json.dumps(data))
    
    if __name__ == "__main__":
        main(sys.argv[1:])
    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值