我正在尝试实现一个简单的帮助器类来与java-properties文件进行交互。摆弄多线属性我遇到了一个问题,我无法解决,也许你可以吗?
类中的unittest首先将跨越两行的多行属性写入属性文件,然后重新读取它并检查是否相等。这才有效。现在,如果我使用该类向属性添加第三行,它会使用我无法解释的其他反斜杠重新读取它。
这是我的代码:
#!/usr/bin/env python3
# -*- coding=UTF-8 -*-
import codecs
import os, re
import fileinput
import unittest
class ConfigParser:
reProp = re.compile(r'^(?P<key>[\.\w]+)=(?P<value>.*?)(?P<ext>[\\]?)$')
rePropExt = re.compile(r'(?P<value>.*?)(?P<ext>[\\]?)$')
files = []
def __init__(self, pathes=[]):
for path in pathes:
if os.path.isfile(path):
self.files.append(path)
def getOptions(self):
result = {}
key = ''
val = ''
with fileinput.input(self.files, inplace=False) as fi:
for line in fi:
m = self.reProp.match(line.strip())
if m:
key = m.group('key')
val = m.group('value')
result[key] = val
else:
m = self.rePropExt.match(line.rstrip())
if m:
val = '\n'.join((val, m.group('value')))
result[key] = val
fi.close()
return result
def setOptions(self, updates={}):
options = self.getOptions()
options.update(updates)
with fileinput.input(self.files, inplace=True) as fi:
for line in fi:
m = self.reProp.match(line.strip())
if m:
key = m.group('key')
nval = options[key]
nval = nval.replace('\n', '\\\n')
print('{}={}'.format(key,nval))
fi.close()
class test(unittest.TestCase):
files = ['test.properties']
props = {'test.m.a' : 'Johnson\nTanaka'}
def setUp(self):
for file in self.files:
f = codecs.open(file, encoding='utf-8', mode='w')
for key in self.props.keys():
val = self.props[key]
val = re.sub('\n', '\\\n', val)
f.write(key + '=' + val)
f.close()
def teardown(self):
pass
def test_read(self):
c = configparser(self.files)
for file in self.files:
for key in self.props.keys():
result = c.getOptions()
self.assertEqual(result[key],self.props[key])
def test_write(self):
c = ConfigParser(self.files)
changes = {}
for key in self.props.keys():
changes[key] = self.change_value(self.props[key])
c.setOptions(changes)
result = c.getOptions()
print('changes: ')
print(changes)
print('result: ')
print(result)
for key in changes.keys():
self.assertEqual(result[key],changes[key],msg=key)
def change_value(self, value):
return 'Smith\nJohnson\nTanaka'
if __name__ == '__main__':
unittest.main()
testrun的输出:
C:\pyt>propertyfileparser.py
changes:
{'test.m.a': 'Smith\nJohnson\nTanaka'}
result:
{'test.m.a': 'Smith\nJohnson\\\nTanaka'}
任何提示都欢迎......
答案 0 :(得分:0)
由于您在写作时在新行前添加反斜杠,因此在阅读时也必须删除它们。取消注释用'\\ n'替换'\ n'的行可以解决问题,但我希望这也意味着文件语法不正确。
只有在第二个换行符时才会发生这种情况,因为你将值分为“椭圆”和“椭圆”,其中“椭圆”是第一行,“nval”是其余的,你只做了在nval上替换。
使用正则表达式替换来替换不是正则表达式的东西也是过度的。您可以使用val.replace('\ n','\\ n')代替。
我会以非常不同的方式执行此解析器。好吧,首先,我根本不会这样做,我会使用现有的解析器,但如果我这样做,我会逐行读取文件,同时处理行继续问题,这样我就有了列表中每个项目只有一个值。然后我将每个项目解析为一个键和一个带有正则表达式的值,然后将其粘贴到字典中。
您可以分别解析每一行,并在解析后将连续行连接到值,IMO完全向后。