2016-05-02 2 views
2

Я занимаюсь курсом Python, а текущее задание - получать информацию из базы данных, добавлять ее в текстовое поле и затем создавать HTML-файл из содержимого внутри текстового поля.Удалить « n» из строки, но оставить фактические строки?

Все работает отлично, с разрывами в строках точно, как я их ввел в базу данных. Единственная проблема заключается в том, что «{{и«}} »добавляются вокруг текста после его получения из базы данных. Поэтому я превращаю текст в строку и фрагмент, который используется с [3: -4]. Но тогда, поскольку теперь это строка, теперь она буквально записывает «\ n» в текст, когда она вводится в текстовое поле.

Есть ли все-таки разрезать скобки, НЕ включать текст «\ n», но все равно сохранить разрывы строк?

Вот что текстовое поле отображается, прежде чем я превратить его в строку и ломтик:

{{Это мой текст! Он выглядит очень чистым, потому что он имеет разрывы строк. ! Сладкие}}

И после того, как я делаю это строка и отрезать концы от:

Это мой текст \ п \ NThe скобки исчезли, но теперь вы можете увидеть LineBreak код \ п \ 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

Единственный способ получить доступ к базе данных в моем скрипте - выбрать один из пяти вариантов из списка со списком только для чтения. –

+0

@NathanR Злоумышленник может легко изменить выпадающий список на стороне браузера. Никогда не доверяйте клиенту. – Selcuk

ответ

1

Это означает, что ваша фактическая строка имеет 2 '\'. Ваша фактическая строка после форматирования: это мой текст! \\ n \\ nКрасики исчезли, но теперь вы можете увидеть код очереди. \\ n \\ nLame! extra \ означает, что \ 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. Важно понять, в каком формате ваши данные входят (список или строки из базы данных) и какой формат он должен быть в (строка), и сделать правильное преобразование после извлечения данных и перед передачей данных в текстовый виджет.

Смежные вопросы