【问题标题】:How to get rid of the single quotes around the representation of a string?如何摆脱围绕字符串表示的单引号?
【发布时间】:2017-08-16 14:08:08
【问题描述】:

此示例代码打印文件中一行的表示。它允许在一行中查看其内容,包括控制字符,如'\n',因此我们将其称为该行的“原始”输出。

print("%r" % (self.f.readline()))

然而,输出显示的每个结尾都添加了' 字符,而这些字符不在文件中。

'line of content\n'

如何去掉输出中的单引号?
(Python 2.7 和 3.6 中的行为相同。)

【问题讨论】:

  • 这就是创建此格式说明符的目的。为什么要删除引号?它们在那里显示字符串的边界。
  • 使用str.strip("'")[1:-1]切片。
  • 指定的“r”`不代表“raw”,它代表“representation”,表示对象的Python表示。由于在这种情况下它是一个字符串,因此它们总是被引用。
  • 这不是“原始说明符”。 %r 说要打电话给 repr 被替换的东西。
  • 很高兴知道。没有听说过repr,所以在阅读了你的答案后用谷歌搜索了它。这是更多细节:stackoverflow.com/questions/1436703/…

标签: python data-representation


【解决方案1】:

%r 采用字符串的repr 表示。它可以根据需要转义换行符等,但还会添加引号。要解决此问题,请使用索引切片自行删除引号。

print("%s" %(repr(self.f.readline())[1:-1]))

如果这就是您要打印的全部内容,则根本不需要通过字符串格式化程序传递它

print(repr(self.f.readline())[1:-1])

这也有效:

print("%r" %(self.f.readline())[1:-1])

【讨论】:

  • 或者添加一对额外的括号:print(("%r" %(self.f.readline()))[1:-1]).
  • 完全没有理由涉及"%s";您可以直接打印切片repr 的结果。
  • @user2357112 - 我遵循用户的模式,假设这只是示例代码,实际格式可能更大。但你是对的,在这种情况下你可以使用print(repr(self.f.readline())[1:-1])
  • print(("%r" % (self.f.readline())).strip("'") 有效但很脆弱。如果您的格式较大(例如,“line: %r”),则会失败。如果它不是更大,那么 - 正如@user2357112 所提到的 - 你根本不需要格式化程序。 Python 在打印repr 时可以免费使用"..." 而不是'...',所以[1:-1] 更安全。
  • 刚刚进行了编辑,并没有意识到它需要同行评审。如果编辑被接受,我将接受这个答案。我认为这是迄今为止最好的,但需要进行一些调整才能完成。
【解决方案2】:

虽然这种方法有点矫枉过正,但在 Python 中,您可以子类化大多数(如果不是全部)内置类型,包括 str。这意味着您可以定义自己的字符串类,其表示形式是您想要的。

以下说明了如何使用该能力:

class MyStr(str):
    """ Special string subclass to override the default representation method
        which puts single quotes around the result.
    """
    def __repr__(self):
        return super(MyStr, self).__repr__().strip("'")

s1 = 'hello\nworld'
s2 = MyStr('hello\nworld')

print("s1: %r" % s1)
print("s2: %r" % s2)

输出:

s1: 'hello\nworld'
s2: hello\nworld

【讨论】:

  • 虽然你说得对,这有点矫枉过正,但对于 Python 新手来说,这是一段有趣的代码,值得学习。
  • 没有意识到我可以对多个答案进行投票。
  • 奇怪的是,您像其他人一样花时间查找代码并回答了这个问题。它在 cmets 中引发了关于最佳解决方案的辩论,我在此过程中发现了一些有用的东西,其他 Python 新手可能会从中受益,但问题本身仍然为零。尽管你在这方面做了很多工作,但你也不喜欢这个问题吗?
  • 或者只是用def __repr__(self): return self.__str__()覆盖MyStr中的__repr__方法
  • @fhgd:你的建议是等效的,因为它会导致子字符串helloworld被打印在不同的行上。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 2020-09-15
  • 2014-09-03
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多