【问题标题】:Remove "\n" from a string, but leave the actual linebreaks?从字符串中删除“\n”,但留下实际的换行符?
【发布时间】:2016-08-26 17:32:16
【问题描述】:

我正在学习 Python 课程,当前的任务是从数据库中获取信息,将其添加到文本框,然后根据文本框内的内容创建 HTML 文件。

一切都完美无缺,换行符与我将它们输入数据库的方式完全相同。唯一的问题是“{{”和“}}”在从数据库中检索到文本后被添加到文本周围。所以我把文本变成了一个字符串,然后用 [3:-4] 把它切掉。但是,由于它现在是一个字符串,所以当它被输入到文本框时,它现在会在文本中直接写入“\n”。

无论如何要切掉括号,不包括“\n”文本,但仍然保留换行符?

这是文本框在我将其转换为字符串和切片之前显示的内容:

{{这是我的文字! 它看起来很干净,因为它有换行符。 甜蜜!}}

在我把它变成一个字符串并切断末端之后:

这是我的文字!\n\n括号不见了,但现在你可以看到换行代码。\n\n蹩脚!

我可以两全其美吗?这是我的代码:

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

【问题讨论】:

  • 不要直接使用str.format,否则容易被SQL注入攻击。
  • 在我的脚本中访问数据库的唯一方法是从只读组合框中的五个选项中选择一个。
  • @NathanR 攻击者可以轻松修改浏览器端的组合框。永远不要相信客户。
  • A Text(box) 自动换行,即添加换行符。创建实例时将 wrap="none" 传递给 Text 类。
  • 我会记住这一点的!目前,学习如何将 tkinter GUI 与 SQLite3 结合起来只是一个简单的练习。一个都不上线,数据库里全是我编的傻事。

标签: python tkinter sqlite textbox


【解决方案1】:

这意味着您的实际字符串中有 2 个“\”。 格式化后的实际字符串是: 这是我的文字!\\n\\n括号不见了,但现在您可以看到换行代码。\\n\\nLame! 额外的 \ 意味着 \n 实际上应该被打印出来,而不是被称为换行符。

【讨论】:

  • 嗯,很奇怪...知道它是如何到达那里的吗?以及如何删除它?
【解决方案2】:

问题的根源是您从数据库中获取数据作为列表列表(尽管内部列表可能是包含 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 中进行转换。重要的是要了解您的数据采用什么格式(数据库中的列表或行),以及它需要采用什么格式(字符串),并在获取数据之后和将数据传递给数据之前进行适当的转换文本小部件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2013-03-07
    • 2022-01-18
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多