zoukankan      html  css  js  c++  java
  • xls5-解析properties文件,在python中基本没有遇到

     xls5-解析properties文件,在python中基本没有遇到

    https://www.runoob.com/python3/python3-dictionary.html

    要解析properties文件,在python中基本没有遇到这中情况,今天用python跑深度学习的时候,发现有些参数可以放在一个global.properties全局文件中,这样使用的时候更加方便。原理都是加载文件,然后用line方法进行解析判断”=”,自己从网上找到一个工具类,记录一下。

    工具类 PropertiesUtiil.py
    # -*- coding:utf-8 -*-
    class Properties(object):

    def __init__(self, fileName):
    self.fileName = fileName
    self.properties = {}

    def __getDict(self,strName,dictName,value):

    if(strName.find('.')>0):
    k = strName.split('.')[0]
    dictName.setdefault(k,{})
    return self.__getDict(strName[len(k)+1:],dictName[k],value)
    else:
    dictName[strName] = value
    return
    def getProperties(self):
    try:
    pro_file = open(self.fileName, 'Ur')
    for line in pro_file.readlines():
    line = line.strip().replace(' ', '')
    if line.find("#")!=-1:
    line=line[0:line.find('#')]
    if line.find('=') > 0:
    strs = line.split('=')
    strs[1]= line[len(strs[0])+1:]
    self.__getDict(strs[0].strip(),self.properties,strs[1].strip())
    except Exception, e:
    raise e
    else:
    pro_file.close()
    return self.properties

    通过上面的代码就可以解析了properties文件了。新建一个文件

    global.properties 文件
    a.name.last=jie
    b.name.first=shi
    #b.name=shijie
    1
    2
    3
    测试 test.py
    from PropertiesUtil import Properties
    dictProperties=Properties("global.properties").getProperties()
    print dictProperties

    控制台打印:

    /usr/bin/python2.7 /home/tengxing/rude-carnie/test.py
    {'a': {'name': {'last': 'jie'}}, 'b': {'name': {'first': 'shi'}}}

    Process finished with exit code 0

    我感觉还是挺方便的
    ————————————————
    版权声明:本文为CSDN博主「牧羊人影视」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/tengxing007/java/article/details/72466187

    https://www.runoob.com/python3/python3-dictionary.html

    工作需要将Java项目的逻辑改为python执行,Java的很多配置文件都是.properties的,文件内容的格式是“键.键.键。。。=值”的格式例如A.B.C=value1,D.F=value2等。并且“#”用来注视。python没有专门处理properties格式的包,只有处理标准的ini格式的包。所以需要自己写一个python程序来处理。不说了上程序。

    这里参考前面一篇://www.jb51.net/article/137390.htm

    主要在前文的基础上,增加key.key.key=value的形式的支持

    Util.py文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    class Properties(object):
      def __init__(self, fileName):
        self.fileName = fileName
        self.properties = {}
      def __getDict(self,strName,dictName,value):
        if(strName.find('.')>0):
          k = strName.split('.')[0]
          dictName.setdefault(k,{})
          return self.__getDict(strName[len(k)+1:],dictName[k],value)
        else:
          dictName[strName] = value
          return
      def getProperties(self):
        try:
          pro_file = open(self.fileName, 'Ur')
          for line in pro_file.readlines():
            line = line.strip().replace(' ', '')
            if line.find("#")!=-1:
              line=line[0:line.find('#')]
            if line.find('=') > 0:
              strs = line.split('=')
              strs[1]= line[len(strs[0])+1:]
              self.__getDict(strs[0].strip(),self.properties,strs[1].strip())
        except Exception, e:
          raise e
        else:
          pro_file.close()
        return self.properties

    filename.properties文件:

    1
    2
    3
    4
    a.b.d=v1
    a.c=v2
    d.e=v3
    f=v4

    测试文件text.py:

    1
    2
    3
    from Util import Properties
    dictProperties=Properties("filename.properties").getProperties()
    print dictProperties

    输出:

    {'a': {'c': 'v2', 'b': {'d': 'v1'}}, 'd': {'e': 'v3'}, 'f': 'v4'}

    更多关于Python

    #! /usr/bin/env python

    """
    A Python replacement for java.util.Properties class
    This is modelled as closely as possible to the Java original.

    Created - Anand B Pillai <abpillai@gmail.com>
    """

    import sys,os
    import re
    import time

    class IllegalArgumentException(Exception):

    def __init__(self, lineno, msg):
    self.lineno = lineno
    self.msg = msg

    def __str__(self):
    s='Exception at line number %d => %s' % (self.lineno, self.msg)
    return s

    class Properties(object):
    """ A Python replacement for java.util.Properties """

    def __init__(self, props=None):

    # Note: We don't take a default properties object
    # as argument yet

    # Dictionary of properties.
    self._props = {}
    # Dictionary of properties with 'pristine' keys
    # This is used for dumping the properties to a file
    # using the 'store' method
    self._origprops = {}

    # Dictionary mapping keys from property
    # dictionary to pristine dictionary
    self._keymap = {}

    self.othercharre = re.compile(r'(?<!\)(s*=)|(?<!\)(s*:)')
    self.othercharre2 = re.compile(r'(s*=)|(s*:)')
    self.bspacere = re.compile(r'\(?!s$)')

    def __str__(self):
    s='{'
    for key,value in self._props.items():
    s = ''.join((s,key,'=',value,', '))

    s=''.join((s[:-2],'}'))
    return s

    def __parse(self, lines):
    """ Parse a list of lines and create
    an internal property dictionary """

    # Every line in the file must consist of either a comment
    # or a key-value pair. A key-value pair is a line consisting
    # of a key which is a combination of non-white space characters
    # The separator character between key-value pairs is a '=',
    # ':' or a whitespace character not including the newline.
    # If the '=' or ':' characters are found, in the line, even
    # keys containing whitespace chars are allowed.

    # A line with only a key according to the rules above is also
    # fine. In such case, the value is considered as the empty string.
    # In order to include characters '=' or ':' in a key or value,
    # they have to be properly escaped using the backslash character.

    # Some examples of valid key-value pairs:
    #
    # key value
    # key=value
    # key:value
    # key value1,value2,value3
    # key value1,value2,value3
    # value4, value5
    # key
    # This key= this value
    # key = value1 value2 value3

    # Any line that starts with a '#' is considerered a comment
    # and skipped. Also any trailing or preceding whitespaces
    # are removed from the key/value.

    # This is a line parser. It parses the
    # contents like by line.

    lineno=0
    i = iter(lines)

    for line in i:
    lineno += 1
    line = line.strip()
    # Skip null lines
    if not line: continue
    # Skip lines which are comments
    if line[0] == '#': continue
    # Some flags
    escaped=False
    # Position of first separation char
    sepidx = -1
    # A flag for performing wspace re check
    flag = 0
    # Check for valid space separation
    # First obtain the max index to which we
    # can search.
    m = self.othercharre.search(line)
    if m:
    first, last = m.span()
    start, end = 0, first
    flag = 1
    wspacere = re.compile(r'(?<![\=:])(s)')
    else:
    if self.othercharre2.search(line):
    # Check if either '=' or ':' is present
    # in the line. If they are then it means
    # they are preceded by a backslash.

    # This means, we need to modify the
    # wspacere a bit, not to look for
    # : or = characters.
    wspacere = re.compile(r'(?<![\])(s)')
    start, end = 0, len(line)

    m2 = wspacere.search(line, start, end)
    if m2:
    # print 'Space match=>',line
    # Means we need to split by space.
    first, last = m2.span()
    sepidx = first
    elif m:
    # print 'Other match=>',line
    # No matching wspace char found, need
    # to split by either '=' or ':'
    first, last = m.span()
    sepidx = last - 1
    # print line[sepidx]


    # If the last character is a backslash
    # it has to be preceded by a space in which
    # case the next line is read as part of the
    # same property
    while line[-1] == '\':
    # Read next line
    nextline = i.next()
    nextline = nextline.strip()
    lineno += 1
    # This line will become part of the value
    line = line[:-1] + nextline

    # Now split to key,value according to separation char
    if sepidx != -1:
    key, value = line[:sepidx], line[sepidx+1:]
    else:
    key,value = line,''

    self.processPair(key, value)

    def processPair(self, key, value):
    """ Process a (key, value) pair """

    oldkey = key
    oldvalue = value

    # Create key intelligently
    keyparts = self.bspacere.split(key)
    # print keyparts

    strippable = False
    lastpart = keyparts[-1]

    if lastpart.find('\ ') != -1:
    keyparts[-1] = lastpart.replace('\','')

    # If no backspace is found at the end, but empty
    # space is found, strip it
    elif lastpart and lastpart[-1] == ' ':
    strippable = True

    key = ''.join(keyparts)
    if strippable:
    key = key.strip()
    oldkey = oldkey.strip()

    oldvalue = self.unescape(oldvalue)
    value = self.unescape(value)

    self._props[key] = value.strip()

    # Check if an entry exists in pristine keys
    if self._keymap.has_key(key):
    oldkey = self._keymap.get(key)
    self._origprops[oldkey] = oldvalue.strip()
    else:
    self._origprops[oldkey] = oldvalue.strip()
    # Store entry in keymap
    self._keymap[key] = oldkey

    def escape(self, value):

    # Java escapes the '=' and ':' in the value
    # string with backslashes in the store method.
    # So let us do the same.
    newvalue = value.replace(':',':')
    newvalue = newvalue.replace('=','=')

    return newvalue

    def unescape(self, value):

    # Reverse of escape
    newvalue = value.replace(':',':')
    newvalue = newvalue.replace('=','=')

    return newvalue

    def load(self, stream):
    """ Load properties from an open file stream """

    # For the time being only accept file input streams
    if type(stream) is not file:
    raise TypeError,'Argument should be a file object!'
    # Check for the opened mode
    if stream.mode != 'r':
    raise ValueError,'Stream should be opened in read-only mode!'

    try:
    lines = stream.readlines()
    self.__parse(lines)
    except IOError, e:
    raise

    def getProperty(self, key):
    """ Return a property for the given key """

    return self._props.get(key,'')

    def setProperty(self, key, value):
    """ Set the property for the given key """

    if type(key) is str and type(value) is str:
    self.processPair(key, value)
    else:
    raise TypeError,'both key and value should be strings!'

    def propertyNames(self):
    """ Return an iterator over all the keys of the property
    dictionary, i.e the names of the properties """

    return self._props.keys()

    def list(self, out=sys.stdout):
    """ Prints a listing of the properties to the
    stream 'out' which defaults to the standard output """

    out.write('-- listing properties -- ')
    for key,value in self._props.items():
    out.write(''.join((key,'=',value,' ')))

    def store(self, out, header=""):
    """ Write the properties list to the stream 'out' along
    with the optional 'header' """

    if out.mode[0] != 'w':
    raise ValueError,'Steam should be opened in write mode!'

    try:
    out.write(''.join(('#',header,' ')))
    # Write timestamp
    tstamp = time.strftime('%a %b %d %H:%M:%S %Z %Y', time.localtime())
    out.write(''.join(('#',tstamp,' ')))
    # Write properties from the pristine dictionary
    for prop, val in self._origprops.items():
    out.write(''.join((prop,'=',self.escape(val),' ')))

    out.close()
    except IOError, e:
    raise

    def getPropertyDict(self):
    return self._props

    def __getitem__(self, name):
    """ To support direct dictionary like access """

    return self.getProperty(name)

    def __setitem__(self, name, value):
    """ To support direct dictionary like access """

    self.setProperty(name, value)

    def __getattr__(self, name):
    """ For attributes not found in self, redirect
    to the properties dictionary """

    try:
    return self.__dict__[name]
    except KeyError:
    if hasattr(self._props,name):
    return getattr(self._props, name)

    if __name__=="__main__":
    p = Properties()
    p.load(open('test2.properties'))
    p.list()
    print p
    print p.items()
    print p['name3']
    p['name3'] = 'changed = value'
    print p['name3']
    p['new key'] = 'new value'
    p.store(open('test2.properties','w'))

    参考来源:http://blog.csdn.net/bobzhangshaobo/article/details/47617107 我们都是在java里面遇到要解析properties文件,在python中基本没有遇到这中情况,今天用python跑深度学习的时候,发现有些参数可以放在一个global.properties全局文件中,这样使用的时候更加方便。原理都是加载文件,然后用line方法进行解析判断”=”,自己从网上找到一个工具类,记录一下。

    工具类 PropertiesUtiil.py

    # -*- coding:utf-8 -*-
    class Properties(object):  
    
        def __init__(self, fileName):  
            self.fileName = fileName  
            self.properties = {}  
    
        def __getDict(self,strName,dictName,value):  
    
            if(strName.find('.')>0):  
                k = strName.split('.')[0]  
                dictName.setdefault(k,{})  
                return self.__getDict(strName[len(k)+1:],dictName[k],value)  
            else:  
                dictName[strName] = value  
                return  
        def getProperties(self):  
            try:  
                pro_file = open(self.fileName, 'Ur')  
                for line in pro_file.readlines():  
                    line = line.strip().replace('
    ', '')  
                    if line.find("#")!=-1:  
                        line=line[0:line.find('#')]  
                    if line.find('=') > 0:  
                        strs = line.split('=')  
                        strs[1]= line[len(strs[0])+1:]  
                        self.__getDict(strs[0].strip(),self.properties,strs[1].strip())  
            except Exception, e:  
                raise e  
            else:  
                pro_file.close()  
            return self.properties  

    通过上面的代码就可以解析了properties文件了。新建一个文件

    global.properties 文件

    a.name.last=jie
    b.name.first=shi
    #b.name=shijie

    测试 test.py

    from PropertiesUtil import Properties
    dictProperties=Properties("global.properties").getProperties()
    print dictProperties

    控制台打印:

    /usr/bin/python2.7 /home/tengxing/rude-carnie/test.py
    {'a': {'name': {'last': 'jie'}}, 'b': {'name': {'first': 'shi'}}}
    
    Process finished with exit code 0

    我感觉还是挺方便的,就对做深度学习来说吧,把模型的的位置,训练数据放在一个global.properties文件中,方便管理。

    # -*- coding:utf-8 -*-
    class Properties(object):

    def __init__(self, fileName):
    self.fileName = fileName
    self.properties = {}

    def __getDict(self,strName,dictName,value):

    if(strName.find('.')>0):
    k = strName.split('.')[0]
    dictName.setdefault(k,{})
    return self.__getDict(strName[len(k)+1:],dictName[k],value)
    else:
    dictName[strName] = value
    return
    def getProperties(self):
    try:
    pro_file = open(self.fileName, 'r')
    for line in pro_file.readlines():
    line = line.strip().replace(' ', '')
    if line.find("#")!=-1:
    line=line[0:line.find('#')]
    if line.find('=') > 0:
    strs = line.split('=')
    strs[1]= line[len(strs[0])+1:]
    self.__getDict(strs[0].strip(),self.properties,strs[1].strip())
    except:
    raise
    else:
    pro_file.close()
    return self.properties


    #
    # from PropertiesUtil import Properties
    # dictProperties=Properties("global.properties").getProperties()
    # print dictProperties
    #

    file_path = r'D:ackupPycharmProjectscharm123prop.properties'
    dictProperties=Properties(file_path).getProperties()
    print (dictProperties)
    print (type(dictProperties))
    print (len(dictProperties))
    print (dictProperties['url'])
    print (dictProperties['driver'])
    hang1=1
    try:
    hang1=dictProperties['hang1']
    except :
    hang1=0

    print (hang1)

    dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

    dict['Age'] = 88 # 更新 Age
    dict['School'] = "添加信息" # 添加信息

    print("dict['Age']: ", dict['Age'])
    print("dict['School']: ", dict['School'])

    del dict['Name'] # 删除键 'Name'
    dict.clear() # 清空字典
    del dict # 删除字典

    print("dict['Age']: ", dict['Age'])
    print("dict['School']: ", dict['School'])






  • 相关阅读:
    2021.4.14
    每日总结
    每日总结
    每日总结
    oracle db组面试 复习数据库
    二叉树根结点到叶节点的最短距离
    minheap 最小堆的实现
    Maximum element in a sorted and rotated array排序和旋转数组中的最大元素
    树和图bfs的一个共同点
    117. Populating Next Right Pointers in Each Node II 不完全二叉树连接右边节点
  • 原文地址:https://www.cnblogs.com/xinxihua/p/12636650.html
Copyright © 2011-2022 走看看