2016-05-02 10 views
2

私はPythonコースをやっています。現在の課題は、データベースから情報を取り出し、テキストボックスに追加し、テキストボックス内のコンテンツからHTMLファイルを作成することです。文字列から「 n」を削除しますが、実際の改行は残しておきますか?

すべてが完全に動作し、行の途切れを正確に入力してデータベースに入力します。唯一の問題は、 "{{"と "}}"がデータベースから検索された後にテキストの周りに追加されることです。だから、私は文字列に文字を変え、その部分を[3:-4]でスライスします。しかし、それは今や文字列であるため、テキストボックスに入力するときに文字通り "\ n"をテキストに書き込むようになりました。

角かっこを切り捨てて、「\ n」のテキストは含めませんが、改行はそのままにしておきますか?ここで

は、私は、文字列やスライスにそれを回す前に、どのようなテキストボックスが表示さです:{{これは私のテキスト

です! 改行があるため、非常にきれいです。 スウィート}}

そして、私はそれの文字列にするとオフ端をカットした後:!。これは私のテキストです\ nは\ nのブラケットがなくなっているが、今あなたが改行コードを見ることができます

\ N \ nLame !

私は両方の世界のベストを持つことができますか?私のコードは次のとおりです。

# Grabs info from database on button click 
def getContent(self): 
    c.execute("SELECT HTML FROM Content WHERE conName ='{}'".format(self.contentBox.get())) 
    fetch = (c.fetchall()) 
    return str(fetch)[3:-4] 

    # Inserts content into textbox 
def setContent(self): 
    self.clear() 
    combo = self.getContent() 
    self.text_body.insert(END,combo) 
+2

'str.format'を直接使用しないでください。そうしないと、SQLインジェクションに脆弱です。 –

+0

私のスクリプトでデータベースにアクセスする唯一の方法は、読み取り専用コンボボックスから5つのオプションの1つを選択することです。 –

+0

@NathanR攻撃者はブラウザ側で簡単にコンボボックスを変更できます。クライアントを信頼しないでください。 – Selcuk

答えて

1

つまり、実際の文字列には2 '\'が含まれています。 フォーマット後の実際の文字列は: これはテキストです!\\ n \\ n括弧はなくなりましたが、改行コードが表示されます。\\ n \\ nLame! 余分な\は、\ nが実際に印刷され、改行とは呼ばれないことを意味します。

+0

うーん、奇妙な...それはどのようにそこに得たかもしれない考え?どのようにそれを削除するには? –

+0

st = st.replace( '\\ n'、 '\ n')はトリックを行うようです – Daniel

+0

優秀、それは完璧に動作します!ありがとう! –

1

問題の根本原因は、データベースのデータをリストのリストとして取得していることです(内側のリストはHTMLを含む単一の要素になる可能性があります)。そのデータを文字通り挿入すると問題が発生しますまたはそのデータを文字列に変換するためにstrを使用する場合は、

たとえば、中括弧が表示される理由は、テキストウィジェットがリストのリストを表示する方法を知らないため、中括弧を使用してリスト項目を区切ることです(理由はありますが、長い説明)。これらの中括弧はデータベースの実際のデータにはないので、テキストウィジェットにリストを追加しようとすると追加されます。

適切な解決策は、データベースのデータをそのままの形式(リストのリストまたはHTML要素のリスト)にして、それをインテリジェントに文字列に変換することです。中括弧を整えたり、改行を変換したり、データを正しく見せるために他の種類のハックを行う必要はなくなりました。

あなたは(あなたが複数の列をバック取得していると仮定した場合)データの各行、およびデータの各列の間のスペースの間に改行をしたい場合たとえば、あなたはこのようなデータを挿入できます。

def getContent(self): 
    c.execute("SELECT HTML FROM Content WHERE conName ='{}'".format(self.contentBox.get())) 
    fetch = (c.fetchall()) 
    return # return a list of lists 

def setContent(self): 
    self.clear() 
    combo = self.getContent() 
    for row in combo: 
     # convert list of columns into a string, by joining 
     # each column with a space 
     text = " ".join(row) 

     # write this row, and a newline, to the text widget 
     self.text_body.insert(END, text + "\n") 

データベースから戻ってくるデータが正確にわからないので、これは正確な解決策ではないかもしれません。ポイントは、データベースコールが返すデータの種類(リストのリスト)を知り、そのデータを文字列に変換するインテリジェントな作業を行う必要があることです。

また、データを変換する別の関数を作成するか、getContentで変換を行うこともできます。重要なことは、データのフォーマット(データベースからのリストまたは行)とそのフォーマット(文字列)の形式を理解し、データを取得した後でデータを渡す前に適切な変換を行うことですテキストウィジェット。

関連する問題