我的数据位于.txt文件中(不,我无法将其更改为其他格式),它看起来像这样:
varaiablename =值
something = thisvalue
youget = the_idea
到目前为止,这是我的代码(取自Pyparsing中的示例):
from pyparsing import Word, alphas, alphanums, Literal, restOfLine, OneOrMore, \
empty, Suppress, replaceWith
input = open("text.txt", "r")
src = input.read()
# simple grammar to match #define's
ident = Word(alphas + alphanums + "_")
macroDef = ident.setResultsName("name") + "= " + ident.setResultsName("value") + Literal("#") + restOfLine.setResultsName("desc")
for t,s,e in macroDef.scanString(src):
print t.name,"=", t.value
那么如何告诉我的脚本编辑特定变量的特定值?
例如:
我想将variablename的值从value更改为new_value。
所以基本上是变量=(我们要编辑的数据)。
我可能应该明确表示我不想直接进入文件并通过将值更改为new_value来更改值,但我想解析数据,找到变量然后给它一个新值。
答案 0 :(得分:6)
即使你已经选择了另一个答案,让我回答你原来的问题,即使用pyparsing如何做到这一点。
如果您尝试在某些文本体中进行选择性更改,则transformString是比scanString更好的选择(尽管scanString或searchString可以通过查找匹配的文本来验证您的语法表达式)。 transformString将对您的输入字符串应用令牌抑制或解析操作修改,因为它会扫描文本以查找匹配项。
# alphas + alphanums is unnecessary, since alphanums includes all alphas
ident = Word(alphanums + "_")
# I find this shorthand form of setResultsName is a little more readable
macroDef = ident("name") + "=" + ident("value")
# define values to be updated, and their new values
valuesToUpdate = {
"variablename" : "new_value"
}
# define a parse action to apply value updates, and attach to macroDef
def updateSelectedDefinitions(tokens):
if tokens.name in valuesToUpdate:
newval = valuesToUpdate[tokens.name]
return "%s = %s" % (tokens.name, newval)
else:
raise ParseException("no update defined for this definition")
macroDef.setParseAction(updateSelectedDefinitions)
# now let transformString do all the work!
print macroDef.transformString(src)
给出:
variablename = new_value
something = thisvalue
youget = the_idea
答案 1 :(得分:3)
对于此任务,您不需要使用特殊实用程序或模块 你需要的是读取行并将它们分成列表,所以第一个索引是左边,第二个索引是右边。 如果以后需要这些值,可能需要将它们存储在字典中。
这里有一个简单的方法,对于python中的新人。取消注释行打印以将其用作调试。
f=open("conf.txt","r")
txt=f.read() #all text is in txt
f.close()
fwrite=open("modified.txt","w")
splitedlines = txt.splitlines():
#print splitedlines
for line in splitedlines:
#print line
conf = line.split('=')
#conf[0] is what it is on left and conf[1] is what it is on right
#print conf
if conf[0] == "youget":
#we get this
conf[1] = "the_super_idea" #the_idea is now the_super_idea
#join conf whit '=' and write
newline = '='.join(conf)
#print newline
fwrite.write(newline+"\n")
fwrite.close()
答案 2 :(得分:1)
实际上,你应该看看the config parser module 它完全解析了你的语法(你只需要在开头添加[section])。
如果您坚持实施,可以创建字典:
dictt = {}
for t,s,e in macroDef.scanString(src):
dictt[t.name]= t.value
dictt[variable]=new_value
答案 3 :(得分:1)
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('example.txt')
variablename = config.get('variablename', 'float')
如果你没有[section]
标题,它会对你大喊大叫,但没关系,you can fake one。