使用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
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:])
作者Focustc,来自于
CSDN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)