2014-02-27 36 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