2016-05-02 3 views
2

Ich mache einen Python-Kurs, und die aktuelle Aufgabe besteht darin, Informationen aus einer Datenbank zu entnehmen, sie einem Textfeld hinzuzufügen und dann eine HTML-Datei aus dem Inhalt des Textfelds zu erstellen.Entfernen Sie " n" von einer Zeichenfolge, aber lassen Sie die tatsächlichen Zeilenumbrüche?

Alles funktioniert perfekt, mit Unterbrechungen in den Zeilen genau wie ich sie in die Datenbank eintippte. Das einzige Problem ist, dass "{{" und "}}" um den Text herum hinzugefügt werden, nachdem er aus der Datenbank abgerufen wurde. Also verwandle ich den Text in eine Zeichenkette und zerschneide diese mit [3: -4]. Aber da es jetzt eine Zeichenfolge ist, schreibt es nun wörtlich "\ n" in den Text, wenn es in die Textbox eingegeben wird.

Gibt es trotzdem die Klammern zu entfernen, NICHT den "\ n" Text, aber immer noch die Zeilenumbrüche?

Hier ist, was die Textbox angezeigt wird, bevor ich es in einen String und in Scheiben schneiden drehen:

{{Das ist mein Text! Es sieht sehr sauber aus, weil es Zeilenumbrüche hat. ! süße}}

Und nachdem ich es machen einen String und schneiden Sie die Enden ab:

Das ist mein Text \ n \ nDie Klammern sind verschwunden, aber jetzt können Sie Zeilenumbrüche Code sehen \ n \ nLame. !

Kann ich das Beste aus beiden Welten haben? Hier ist mein Code:

# 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

Verwenden Sie 'str.format' nicht direkt oder Sie sind anfällig für SQL-Injection. –

+0

Die einzige Möglichkeit, auf die Datenbank in meinem Skript zuzugreifen, besteht darin, eine von fünf Optionen aus einer schreibgeschützten Combobox auszuwählen. –

+0

@NathanR Ein Angreifer kann die Combobox auf der Seite des Browsers leicht ändern. Traue niemals dem Kunden. – Selcuk

Antwort

1

Das bedeutet, dass Ihre tatsächliche Zeichenfolge hat 2 '\' drin. Ihre tatsächliche Zeichenfolge nach der Formatierung ist: das ist mein Text! \\ n \\ nDie Klammern sind weg, aber jetzt können Sie Zeilenumbrüche Code sehen. \\ n \\ nLame! Das Extra \ bedeutet, dass \ n eigentlich gedruckt werden sollte und nicht als Zeilenumbruch bezeichnet wird.

+0

Hmmm, komisch ... eine Ahnung wie es dort hin gekommen sein könnte? und wie man es entfernt? –

+0

st = st.replace ('\\ n', '\ n') scheint den Trick zu machen – Daniel

+0

Ausgezeichnet, es funktioniert perfekt! Vielen Dank! –

1

Der Grund des Problems ist, dass Sie Daten aus der Datenbank zurück als eine Liste von Listen erhalten (obwohl die innere Liste ein einzelnes Element mit dem HTML sein kann) Sie verursachen Probleme, wenn Sie diese Daten entweder wörtlich einfügen in ein Widget oder wenn Sie str verwenden, um diese Daten in eine Zeichenfolge zu konvertieren. Der Grund dafür, dass geschweifte Klammern beispielsweise darin bestehen, dass das Textwidget nicht wissen kann, wie eine Liste von Listen angezeigt werden soll, verwendet geschweifte Klammern, um Listenelemente zu skizzieren (es gibt einen guten Grund, aber es ist ein.) lange Erklärung). Diese geschweiften Klammern befinden sich nicht in den tatsächlichen Daten aus der Datenbank. Sie werden hinzugefügt, wenn Sie versuchen, dem Text-Widget eine Liste hinzuzufügen.

Die richtige Lösung besteht darin, Ihre Datenbankdaten in ihrer rohen Form (Liste der Listen oder Liste der HTML-Elemente) aufzunehmen und sie intelligent in eine Zeichenfolge umzuwandeln. Sie müssen dann nicht länger Klammern trimmen oder Zeilenumbrüche konvertieren oder andere Arten von Hacks ausführen, damit Ihre Daten richtig aussehen.

Zum Beispiel, wenn Sie eine neue Zeile zwischen jeder Zeile von Daten soll, und einen Abstand zwischen den einzelnen Datenspalte (vorausgesetzt, Sie bekommen mehr als eine Spalte zurück), können Sie die Daten wie folgt ein:

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") 

Dies ist möglicherweise nicht die genaue Lösung für Sie, da ich nicht genau weiß, was die Daten aus der Datenbank zurückkommen. Der Punkt ist, dass Sie wissen müssen, welche Art von Daten der Datenbankaufruf zurückgibt (eine Liste von Listen), und um eine intelligente Aufgabe auszuführen, diese Daten in eine Zeichenfolge umzuwandeln.

Sie können auch eine separate Funktion zum Konvertieren der Daten erstellen, oder Sie können die Konvertierung in getContent durchführen. Es ist wichtig zu verstehen, in welchem ​​Format Ihre Daten enthalten sind (eine Liste oder Zeilen aus der Datenbank) und welches Format sie haben muss (String), und eine korrekte Konvertierung nach dem Abrufen der Daten und vor der Übergabe der Daten an die Text Widget.

Verwandte Themen