`
zwhc
  • 浏览: 264700 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

将 kjd.sgf (围棋定式)转换为 sql 语句的 python 源码

阅读更多
附件里是将 kjd.sgf (围棋定式)转换为 sql 语句的 python 源码,以及 sgf 源文件及生成的 sql 源文件。改自 eidogo.com。

今天玩 python 的体会:1、因为用到 simplejson,我用的是 python 2.66 的版本。太低了(2.1.7)好象不行。2、python 里不能用 tab 符号?3、python 确实很强大。

#import MySQLdb as mysql
import simplejson

class SgfNode:
    def __init__(self, id, parent):
        self.id = id
        self.properties = {}
        self.parent = parent
        self.children = []
        # DB prep fields
        self.depth = 0
        self.lt = 0
        self.rt = 0
        pass

class SgfParser:
    def __init__(self, sgf):
        self.sgf = sgf
        self.pos = 0
        self.root = SgfNode(0, None)
        self.nodecounter = 1
        self.parse_tree(self.root)
    
    def parse_tree(self, r):
        while (self.pos < len(self.sgf)):
            c = self.sgf[self.pos]
            self.pos += 1
            if c == ';':
                r = self.parse_node(r)
            elif c == '(':
                self.parse_tree(r)
            elif c == ')':
                return

    def parse_node(self, parent):
        node = SgfNode(self.nodecounter, parent)
        self.nodecounter += 1
        node = self.parse_properties(node)
        cur = node
        depth = 0
        while 1:
            cur = cur.parent
            if not cur:
                break
            depth += 1
        node.depth = depth
        parent.children.append(node)
        return node

    def parse_properties(self, node):
        prop = ''
        vals = []
        i = 0
        while (self.pos < len(self.sgf)):
            c = self.curc()
            if c == ';' or c == '(' or c == ')':
                break
            if self.curc() == '[':
                while self.curc() == '[':
                    self.pos += 1
                    vals.insert(i, '')
                    while self.curc() != ']' and self.pos < len(self.sgf):
                        if self.curc() == '\\':
                            self.pos += 1
                            while self.curc() == '\r' or self.curc() == '\n':
                                self.pos +=1
                        vals[i] += self.curc()
                        self.pos += 1
                    i += 1
                    while self.curc() == ']' or self.curc() == '\r' or self.curc() == '\n':
                        self.pos += 1
                if node.properties.has_key(prop):
                    if not (type(node.properties[prop]) is list):
                        node.properties[prop] = [node.properties[prop]]
                    node.properties[prop].extend(vals)
                else:
                    if (len(vals) > 1):
                        node.properties[prop] = vals
                    else:
                        node.properties[prop] = vals[0]
                prop = ''
                vals = []
                i = 0
                continue    
            if c != ' ' and c != '\n' and c != '\r' and c != '\t':
                prop += c
            self.pos += 1
        return node
        
    def curc(self):
        return self.sgf[self.pos]

def compute_ltrt(node, lt):
    rt = lt + 1
    for child in node.children:
        rt = compute_ltrt(child, rt)
    node.lt = lt
    node.rt = rt    
    return rt + 1

def db_populate(n, c):
    if n.parent:
        parent_id = n.parent.id
    else:
        parent_id = 0
    c.write( "insert into kjd (id, parent, properties, lt, rt, depth) values(" )
    c.write(str(n.id) + "," + str(parent_id) + ",'" + str(simplejson.dumps(n.properties))
#   c.write(str(n.id) + "," + str(parent_id) + ",'" + str(n.properties)
				+ "'," + str(n.lt) + "," + str(n.rt) + "," + str(n.depth) + ")\r\n")
    print n.id
    for child in n.children:
        db_populate(child, c)
        
def file_print(data, c):
    c.write(data)
    c.write('\r\n')
    
#if __name__ == "__main__":
#    file = open("../sgf/kjd.sgf")
file = open("kjd.sgf")
sgf = file.read()
file.close()
root = SgfParser(sgf).root
compute_ltrt(root, 1)
#    db = mysql.connect(host="localhost", user="", passwd="", db="eidogo")
#    c = db.cursor()
#    db_populate(root, c)
#    c.execute("update kjd set parent=null where id=0")
c = open("kjd.sql", "w")
db_populate(root, c)
#    c.write( "insert into kjd (id, parent, properties, lt, rt, depth) values(" )
c.write("update kjd set parent=null where id=0\r\n")
# file_print( "insert into kjd (id, parent, properties, lt, rt, depth) values(", c )
# file_print( "update kjd set parent=null where id=0", c )
c.close()
    

0
0
分享到:
评论

相关推荐

    将 kjd.sgf (围棋定式)转换为 sql 语句的 python

    标题 "将 kjd.sgf (围棋定式)转换为 sql 语句的 python" 提示我们,这是一个关于使用Python编程语言处理特定类型的围棋定式文件(.sgf)并将其转换为SQL语句的项目。SGF(Smart Game Format)是一种广泛用于存储棋类...

    KJD矿用隔爆兼本安型计算机操作基础手册.doc

    《KJD矿用隔爆兼本安型计算机操作基础手册》是针对KJD127型号的矿用隔爆兼本安型计算机的操作指南。这种计算机主要用于监测煤矿综采工作面液压支架的状态和煤机的位置,它整合了计算机控制、网络功能以及显示设备,...

    KJD十七矿用隔爆兼本安型计算机操作手册.pdf

    1. **系统集成**:KJD127计算机集成了计算机控制、网络应用和显示功能,运行Linux操作系统,具备矿用电缆引入装置,支持光纤以太网接入和CAN总线数据转换接口。 2. **硬件配置**: - CPU:采用三星S3C2410 ARM9...

    KJD25T离层监测系统测试诊断仪使用说明书.doc

    KJD25T离层监测系统测试诊断仪使用说明书.doc

    专题资料(2021-2022年)KJD25T离层监测系统测试诊断仪使用说明书.doc

    KJD25T离层监测系统测试诊断仪是保障离层监测系统稳定运行的重要工具,正确的使用和维护将大大提升工作效率,减少潜在的故障风险。在日常操作中,用户应仔细阅读并遵循使用说明书,以充分利用其各项功能。

    基于ARM智能KJD400型矿用蓄电池管理器的研究.pdf

    在这份研究论文《基于ARM智能KJD400型矿用蓄电池管理器的研究》中,作者王德胜探讨了利用ARM处理器技术开发智能矿用蓄电池管理器的过程、结构、功能以及其在矿业应用中的优势和必要性。论文详细介绍了ARM技术在矿用...

    基于ARM智能KJD400型矿用蓄电池管理器的研究

    基于ARM的智能型KJD400型矿用蓄电池管理器的研究,主要是通过双芯、本质安全型、隔离、双向串行通信等关键技术,精确的充放电检测与管控,解决了普遍存在的过充电、过放电对蓄电池寿命的破坏根源。重点介绍其基本原理、...

    KJD11-36型局部通风机自动切换控制器及应用

    为满足高庄矿瓦斯管理要求,在局部通风机中更换使用新型的KJD11-36局部通风机自动切换控制器。介绍了该自动切换控制器的主要参数、功能,安装步骤及注意事项。该装置在各个掘进工作面成功安装后,实现了双风机、双电源...

    系统说明书资料.pdf

    - KJD30Z为核心的井下系统提供了多种驱动模式下的起停控制、保护功能(如跑偏、打滑、超速、急停、堆煤、烟雾等)、12寸液晶显示器显示状态和故障、以太网和RS484接口与矿井平台互联,以及远程联动、本机自动和驱动...

    智能节电器说明书

    【KJD03智能节电器】是浙江科丰电子有限公司研发的一款高效节能产品,它集成了科丰的专利控制电路和高效换流技术。这款节电器的主要特点是能够实时监测电网电压,采用低损耗设计,通过两级自动调压来优化电力消耗,...

    Dynamips模拟《CCNA_交换机:工大瑞普虚拟实验室》实验笔记

    例如,可以将三台交换机分别命名为SW1、SW2和SW3。操作命令如下所示: ``` Router&gt;en # 进入特权执行模式 Router#conf t # 进入全局配置模式 Router(config)#hostname SW1 # 设置交换机名称 SW1(config)# ``` ####...

    基于STM32单片机的馈能悬架控制系统设计.pdf

    馈能悬架控制系统是一种利用车辆运动过程中的能量,将这些能量回收并为悬架系统提供能量的创新技术。这种技术有助于提升汽车的能源使用效率,并优化车辆的悬挂性能。本设计以STM32单片机为核心,结合馈能悬架系统的...

    基于PLC的胶带控制系统设计.doc

    根据现场设备情况及总体集控要求,设置了就地起停按钮,为满足就地及集控起停的要求,控制回路中设置运行转换开关,起动方式互为闭锁。不管哪种运行方式,当按下停止按钮时立即停车。 根据皮带运行规程要求和实际的...

    Dynamips模拟《CCNA 交换机:工大瑞普虚拟实验室》实验笔记

    首先,通过CLI命令行界面,将三个交换机分别命名为SW1、SW2和SW3,并配置其管理IP地址。例如,SW1的管理IP被设定为192.168.1.10/24。这些操作通常在VLAN1上完成,因为它是默认的管理VLAN。 ``` Router#conft Router...

    KJ161胶带输送机集中监控系统设计说明.doc

    该系统采用多种传感器采集信号,通过 CAN 总线传输到 KJD30Z 矿用本安型计算机中,然后通过远程集控的方式将分析后的信号传到地面集控室,提高了信息反馈的速度和井上管理人员解决异常情况的能力。 该系统的设计...

    git fatal detected dubious ownership in repository 的解决方法.rar

    开发案列优质学习资料资源工具与案列应用场景开发文档教程资料

    煤矿自动化控制系统样本.doc

    此系统以安全、可靠、高效、经济为目标,适应于恶劣环境,并具备行程测量、程序控制、速度电流调节等功能。通过集成控制和监视系统,减少故障率,简化操作,减轻工人负担,提高生产安全性,缩短装卸时间,从而增加...

    线路中桩坐标计算程序_曲线坐标计算_线路中桩坐标计算程序_40_

    程序可实现曲线左转、右转的整体坐标计算。根据实际工程需要更改编译预处理#define L0 40、#define R 400、#define KJD0 0.000处起算数据,并输入JD0、JD1、JD2坐标,即可获得综合要素、主点里程与测设坐标。

Global site tag (gtag.js) - Google Analytics