2014-02-27 35 views
0

我正在读取一个文本文件中的列名称列表,然后使用它们来使用pystache呈现一个sql模板,然后将呈现的模板写入一个sql文件。偶尔列名会因此需要一个冒号用双引号中查询包围列名的文本文件替换&qout;“用python编写文本文件时

例:

column1 
"column2:extra" 
column3 

我遇到了一个问题,即双引号越来越换成& ;在输出文件中。我一直在使用

#read in column names 
with open(attrs_file, 'r') as fields: 
    attrs = fields.read().splitlines() 

... 

with open(sql_in, 'r') as sql: 
    data = sql.read() 
    data = pystache.render(data, {'replace':new}) 

with open(sql_out, 'wb') as sql: 
    data = data.replace('&qout;', '"') 
    #data = data.replace('&qout;', "\"") 
    sql.write(data) 

替换方法没有奏效试过了,我宁可不要创建该文件后做后期处理,以搜索和替换和&qout;。感谢您的任何建议。

+0

我看到你正在使用pystache,大概是用全局变量'new'的值来构造一个合适的SQL查询字符串。请注意,除非'new'的值已经被广泛审查,否则您将面临SQL注入漏洞(请参阅https://www.owasp.org/index.php/SQL_Injection)。 如果您使用的是Python DB API,可以通过参数化不打开此类漏洞的查询的方式,但是您不涉及项目的这一部分。我建议'pystache'不是你需要的。 – holdenweb

+0

干杯,谢谢你的抬头。这只是一个本地postgres数据库,以帮助处理一些空间数据。然后生成的sql文件作为shell脚本的一部分运行。这可能会偏离原来的问题,但有没有更好的方法来建立SQL文件的字段名称会有所不同? – Jeff

+0

那么你可以看看支持Python DBAPI的许多软件包之一的内部感觉,但是感谢提醒我你不能在SQL查询中参数化诸如表和列的结构元素(因为这会使SQL解释器我相信)重新使用准备好的查询的能力)。 因此,您构建自己的声明已脱身。但是你可能想要考虑使用比pystache更简单的方法来扩展你的模板(显然已经有引号了)。考虑只使用Python字典和%(名称)插值。 – holdenweb

回答

0

replace不会在原地修改字符串,它会返回一个新的字符串实例并进行所需的更改。您应该将返回的值分配给某个东西。

data = data.replace('&qout;', '"') 
+0

Err ..谢谢你。尽管如此,仍然不能纠正最终输出。 – Jeff

+1

我看到你编辑你的代码,使'date = data.replace('&qout;','''')'。这个'date'应该是'data'。 – Kevin