用于游戏开发中的数据转换
- python包"openxl"和"google.protobuf"
- 将Excel数据文件直接转换为Protobuf格式保存
- 自动处理Excel数据
ProtoBuf支持的数据类型 openxl中读取得到的数据类型
- 文件字符编码问题
- Excel中的数据格式,以及与Protobuf的对应关系。如Excel中的整形、浮点、公式、日期等怎么转换为Protobuf数据
- 将Excel中的列值设置到Protobuf
- 预留接口处理需要处理的特殊字段
游戏中使用的数据类型使用的数据类型其实相对简单,protobuff提供的类型基本满足要求的(虽然感觉有些浪费空间);openxl经过测试也可以使用的支持整形,浮点,日期(datetime.datetime)。由于日期解析为了python类型,所以稍微调整一下即可。预留接口registerFieldProcessor
用户可以注册一个处理函数来处理表中的特殊字段。
protobuf的基本语法:
* syntax = "proto3";
* package Arrow;
* 重复字段(与proto2一样)使用关键字"repeated
"
对repeated字段的操作: * 添加
// item为itemTable中的一个重复字段 // 使用add方法,即添加了一个新的空记录 newRecord = itemTable.item.add()
访问
for record in itemTable.item: // 字段不遍历比较麻烦 print(record)
使用
isinstance(ob, type)
来判断对象的类型,对于一些内置类型,如函数,需要使用模块types
if isinstance(ob, int): pass elif isinstance(ob, types.FunctionType) pass
参见此文
为什么不使用type(ob)来判断?
datetime.datetime类型怎么转换为unix时间
datetime.datetime.timetuple() time.mktime(...)返回的为浮点
datetime ----------------------------> time.time_struct ------------------> unix time
函数"
setattr/getattr
",通过属性名给对象设置属性值(这算是反射吗?)如何取得执行脚本所在目标?
首先取得路径有下面几种方法:
os.getcwd() # 返回当前工作工作。即运行脚本时所在的目录 os.path.realpath(path) # 返回文件的canonical path. 去除了其中可能的符号链接。真正返回文件路径的方法 os.path.realpath(__FILE__) # 即能得到当前脚本的全路径。再使用使用os.path中的方法进一步处理得到更多数据
参考 如何获得Python脚本所在目录的位置 `https://docs.python.org/2.7/library/os.path.html#os.path.realpath`_
模块的导入方法
导入模块的最直接的方法当然是
import moduleName
,但是,有时候想导入指定的模块,而这个名称是一个变量,此时import
就无计可施了。这个时候就需要__import__
函数来大展手脚。module = __import__("xx")
但是,
__import__
函数并不会把导入的模块/函数放到当前模块空间,而直接返回,需要一个对象来接收。如果没有变量接收,能不能找到呢?不知道。见后解如果要导入一个目录下所有模块,通常使用
from pb import *
。实际上它发生了什么呢?怎么去找的呢? `https://docs.python.org/2.7/tutorial/modules.html#importing-from-a-package`_ 事实上,import语句会去读pb目录下的__init__.py
文件中的list变量__all__
将其中的模块导入到当前namespace。注意必须确保__all__
中的模块已经导入,否则会出错。模块
importlib
是对函数__import__
的包装。从中可以发现,__import__
后,怎么找到导入的模块:sys.modules[modulename]
。详见代码中导入Excel对应的protobuf模块方法和importlib源码。如何获得当前模块对象?
正好上面提到的
sys.modules[modulename]
可以找到对应的模块。那么只要modulename为当前模块名即可。所以sys.modules[__name__]
即可取得当前模块。编码问题
方法一: 文件开始使用
# -*- coding: utf-8 -*-
方法二:
import sys reload(sys) sys.setdefaultencoding("utf-8")
参考:`http://www.cnblogs.com/walkerwang/archive/2011/08/03/2126373.html`_
三元运算符
python的三元运算符不同于c/c++的`` condition ? true_result : false_result``的形式。python的形式如下:
ret = true_result if condition else false_result
关于反射的一些资料
`https://docs.lvrui.io/2016/06/16/Python%E5%8F%8D%E5%B0%84%E8%AF%A6%E8%A7%A3/`_ `http://blog.csdn.net/lokibalder/article/details/3459722`_ `http://www.cnblogs.com/huxi/archive/2011/01/02/1924317.html`_ `http://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html`_
将处理类改写为一个通用类,可以处理任何一个表。