【问题标题】:why output string has three sets of double quotes around it为什么输出字符串周围有三组双引号
【发布时间】:2020-03-12 15:34:43
【问题描述】:

我对 python 还很陌生。遵循here 的建议,试图强制输出带有单组双引号的字符串(例如,"my_string"),但它总是以这样的方式打印出来:"""my_string"""

知道为什么吗?

我试过了: '"' + my_string + '"'f'"{self.args["name"]}"'str(my_string)"\"" + my_String + "\"" 但行为相同:

"""my_string"""

代码sn-p:

def print_out(self):
    self.args = {}
    self.args["name"] = 001
    self.bla = 1
    self.tra = 0
    self.val = 0.12445
    with open("my_file", "w") as fout:
          tsv = csv.writer(fout, delimiter="\t")
          tsv.writerow(["name", "bla", "tra", "hehe"])
          tsv.writerow(
                    [f'"{self.args["name"]}"', self.bla, self.tra, round(self.val, 2)]
          )

在上面的例子中,self.args["name"] 打印为"""001"""

谢谢

【问题讨论】:

  • print("Hello") 应该在屏幕上显示为Hello,根本没有引号,所以你一定是在做一些不寻常的事情。向我们展示您正在使用的实际代码。否则我们只能猜测原因。
  • 如何打印?你能提供一个Minimal, Reproducible Example吗?
  • 显而易见的答案是它不是打印的神器; my_string实际上包含引号。
  • 默认方言使用" 引用包含字段分隔符或引号字符的字段。引号字符被转义,同样默认情况下,通过加倍它。
  • 现在的问题是,您为什么要自己在该字段周围添加引号?

标签: python string formatting


【解决方案1】:

CSV 文件有许多不同的方言。在最简单的形式中,它们只是一个字符串列表,由分隔符分隔。在这种情况下,您使用的是选项卡。

当你想要一个包含分隔符的值时,问题就开始了;那么您必须以某种方式转义选项卡以防止解析器将其视为此类。一种方法是引用整个字段。

但是现在,如何在字段的值中包含引号?默认情况下,您引用该字段并通​​过将它们加倍来转义文字引号。

所以,"001" 变为 """001""",因为值 "001" 必须被引用,而文字 " 每个都被 "" 替换。解析器(使用此默认方言)将看到 "..." 并去除最外面的引号,然后用单引号替换每个剩余的 pair 引号以从 """001""" 返回 "001"

似乎有多种方法可以禁用双引号,您需要哪种方法可能取决于您使用的另一种数据。一种简单的方法是在创建 CSV 写入器时简单地将 quotechar 参数设置为 None

      tsv = csv.writer(fout, delimiter="\t", quotechar=None)

有关如何在 CSV 文件中准确引用和/或转义数据的更多信息,请参阅 Dialects and Formatting Parameters


演示:

>>> f = csv.writer(sys.stdout, delimiter="\t")
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"""001"""   3
13
>>> f = csv.writer(sys.stdout, delimiter="\t", quotechar=None)
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"001"   3
9

(每次调用f.writerow 都会显示写入标准输出的数据,然后是其返回值。)

【讨论】:

  • 感谢您提供所有详细信息。它确实输出了字段周围没有引号,因此设置quotechar = None 无效。即使我设置了quotechar = '"',它仍然不带引号导出。 ehh ..我会玩它并最终弄清楚一些事情。感谢您的宝贵时间
  • 好的。显然,如果我将我的字符串设置为'"' + self.args["name"] + '"' 并结合quotechar=None 作为csv.writer 的参数会产生预期的输出。可能这就是您在回答@chepner 中的实际意思。再次感谢
【解决方案2】:
f'"{self.args["name"]}"'

该字符串包含嵌入的双引号,因此您告诉csv 写入文字值"1"

但是,csv 足够聪明,它知道如果它在文件中只写了"1",那么文件的未来读者可能会感到困惑——这应该是一个普通的1,它只是发生了在它周围加上引号,或者它实际上是值"1"

由于您告诉 csv 写一个文字 "1",因此 csv 使用三引号作为特殊语法。

大概你的意思是使用f'{self.args["name"]}',而不是额外的引用层。

【讨论】:

  • 字符串本身是001,我希望它通过csv.writer导出为"001"
  • 好吧,我试图理解为什么默认情况下它使用 根本不使用引号,当我想添加 一组引号时三作为你所说的“特殊语法”
  • 使用f'{self.args["name"]}' 没有不同的效果。仍然输出"""001"""
  • 用所示的代码是不可能的。向我们展示您正在使用的self.args 的实际定义。 (001 不是合法值,所以我知道代码不正确。)
  • 即使真正的代码太复杂,你也可以制作一个演示行为的玩具程序。
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 2018-10-29
  • 2012-10-16
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多