【问题标题】:How to write multiple strings in one line?如何在一行中写入多个字符串?
【发布时间】:2012-01-01 00:54:01
【问题描述】:

我已经开始使用 LPTHW 学习 Python,并且已经开始练习 16:

http://learnpythonthehardway.org/book/ex16.html

感觉自己像个白痴,因为我无法弄清楚其中一个看似简单的“额外学分”作业需要以下内容:

target.write(line1)
target.write('\n')
target.write(line2)
target.write('\n') 
target.write(line3)
target.write('\n') 

被压缩为一行代码。我尝试了以下一些方法:

target.write(line1 \n, line2 \n, line3 \n)

或者:

target.write('line1 \n, line2 \n, line3 \n')

或者:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)

我只是无法让它在同一行中重写第 1 行、第 2 行和第 3 行字符串。而且我尝试了各种其他组合,包括或不包括逗号、引号等。我不断收到不同的错误,比如无效语法或我有太多参数。

【问题讨论】:

    标签: python string


    【解决方案1】:
    target.write(line1 \n, line2 \n, line3 \n)
    

    '\n' 仅在字符串文字中才有意义。没有引号,您就没有字符串文字。

    target.write('line1 \n, line2 \n, line3 \n')
    

    好的,现在一切都是字符串文字。但是您希望 line1、line2、line3 不是字符串文字。您需要这些作为 python 表达式来引用有问题的变量。基本上,您必须在字符串周围加上引号,这些字符串实际上是像 "\n" 这样的文本,而不是变量。如果你这样做了,你可能会得到类似的东西:

    target.write(line1 '\n' line2 '\n' line3 '\n')
    

    2 2 是什么?没什么。您必须向 python 指定如何组合这两个部分。所以你可以有2 + 22 * 22 2 没有任何意义。在这种情况下,我们使用 add 来组合两个字符串

    target.write(line + '\n' + line2 + '\n' + line3 + '\n')
    

    继续,

    target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)
    

    同样\n 仅在字符串文字中才有意义。 % 运算符用于生成字符串时,将字符串作为其左侧。所以你需要一个字符串中的所有格式化细节。

    target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3)
    

    但是产生 3 个字符串文字,你只需要一个。如果你这样做了,写抱怨,因为它除了一个字符串,而不是 3。所以你可能已经尝试过类似的东西:

    target.write('%r \n%r \n%r \n') % (line1, line2, line3)
    

    但是您想将 line1、line2、line3 写入文件。在这种情况下,您正在尝试在写入完成后进行格式化。当 python 执行它时,它将运行 target.write 首先离开:

    None % (line1, line2, line3)
    

    这不会有任何用处。为了解决这个问题,我们需要将% () 放在.write()

    target.write('%r\n%r\n%r\n' % (line1, line2, line3))
    

    【讨论】:

    • 感谢您提供全面的答案/解释。我真的不仅了解正确的答案,还了解错误的答案以及这里发生的事情。谢谢!
    • @jstacks,那我这里的任务就完成了!
    【解决方案2】:

    您的最后一次尝试看起来很有希望。它应该看起来像:

    "%s \n %s \n %s" % (line1, line2, line3)
    

    这会将运算符 % 应用于字符串(带有 3 个 %s 占位符)和要替换的值元组(此处为字符串)。结果是格式化的字符串。

    因此,您需要将其包装在获取结果的函数中:

    target.write("%s \n %s \n %s" % (line1, line2, line3) )
    

    【讨论】:

    • 我真的不知道是给你还是'+'回答复选标记。但是,我从没想过使用“+”,但这是一个很好的学习课程。这里的括号是另一个,我很欣赏那个。使用这种方法时,它似乎向我抛出了引号......我该如何解决这个问题?因为删除它们会导致语法错误。
    • @jstacks,如果您需要有关语法错误的帮助,请始终向我们展示代码和语法错误。
    • 引用是因为我一直使用 %r,使用 %s 修复了这个问题……但为什么呢?我知道's'意味着它将专门针对一个字符串。但是 r 不是更广泛地工作并且仍然带回一个字符串吗?为什么不一样?此外,当使用此方法时,第 2 行和第 3 行略微缩进。为什么会发生这种情况?解决方法是什么?
    • @jstacks, 5r 使用 repr() 添加引号,%s 使用 str() 而不是。它们都将任何东西都转换为字符串,但它们有不同的规则。由于字符串中换行符周围的空格,您有额外的缩进。
    【解决方案3】:

    这是一种方法:

    target.write(line1 + '\n' + line2 + '\n' + line3 + '\n')
    

    以下不起作用的原因

    target.write(line1 \n, line2 \n, line3 \n)
    

    line1 是不是一个变量(注意它没有被引用)但'\n' 是一个字符串文字(因为它在引号中)。加法运算符为字符串连接(组合)它们而重载。

    这不起作用的原因:

    target.write('line1 \n, line2 \n, line3 \n')
    

    是因为line1 是一个变量。当你把它放在引号中时,它不再被视为一个变量。

    【讨论】:

    • 我已经尝试过 (line1 '\n', line 2 '\n', line3 '\n') 但这也不起作用(也尝试在所有内容之间使用逗号)。 + 有效但逗号无效的任何原因?我想它将逗号之间的所有内容都视为它自己的参数,而不仅仅是一个带有单独变量的参数?那么,+ 可以缓解这种情况吗?
    • @jstacks 方法调用中的逗号是参数的分隔符,所以是的,当只需要一个参数时,它会将其视为单独的参数。之间的空格在 Python 中毫无意义,所以这是一个错误。 + 在操作顺序上比函数求值具有更高的优先级,正如我上面提到的,字符串的加号是连接。例如print "hello"+"world"print "helloworld" 100% 相同。或者对于数字,print 1+1print 2 相同,因为加号发生在打印之前。
    • 谢谢 在您和温斯顿发布的内容之间,我确实学到了很多东西。 Stackoverflow 很棒。
    【解决方案4】:

    下面一行对我有用,

     target.write(line1 + line + line2 + line + line3 + line)
    

    在此之前我添加了

     line = '\n'
    

    我的代码如下:

     from sys import argv
     script, filename = argv
     print 'Appending process starts on: %r' % filename
     target = open(filename, 'a')
     print 'Enter the contents:\t'
     line1 = raw_input('Next:\t')
     line2 = raw_input('Next:\t')
     line3 = raw_input('Next:\t')
     line = '\n'
     target.write(line1 + line + line2 + line + line3 + line)
     print 'Thank you !'
    

    【讨论】:

      【解决方案5】:

      作者建议使用格式、字符串和转义符,因此以下工作。这实现了 Python 的 f 字符串:

      target.write(f"{line1} \n{line2} \n{line3} \n")
      

      【讨论】:

        【解决方案6】:

        不要试图让它过于复杂。该字符串的工作方式与您打印某些内容时相同,只是您以 target.write 开头,因此您可以将其写入文件而不是打印。

        例如,如果您要打印变量并将它们放在一个新行上,您将使用此字符串

        打印(f"{line1} \n{line2} \n{line3} \n")

        在练习 5 中,您了解到要拉入一个变量,您需要将 {} 放在您为变量指定的名称周围,如果您想将变量拉入一个字符串,您必须以 f 开头您的字符串 在练习 9 中,你学会了使用 \n 来换行

        现在你想写入文件而不是打印它,所以字符串是相同的,只是这次以 target.write 开头 target.write(f"{line1} \n{line2} \n{line3} \n")

        【讨论】:

          【解决方案7】:

          不确定这是否是pythonic方式,但无论如何它都能完成工作。

          a = f"""
          {line1}
          {line2}
          {line3}
          """
          target.write(a)
          

          【讨论】:

            【解决方案8】:

            LPTHW:练习 16,学习练习 3

            这个文件里的重复太多了。

            使用字符串、格式和转义来打印出 line1、line2 和 line3,只需一个 target.write() 命令而不是六个。

            更强大的target.write实现#Study Drill 3

            formatter = "{0}\n{1}\n{2}\n"
            target.write(formatter.format(line1,line2,line3))
            

            【讨论】:

              【解决方案9】:

              这个信息真的很有帮助。通过执行以下操作,我得到了正确的结果:

              target.write(line1 + "\n" + line2 + "\n" + line3 + "\n")
              

              我永远不会想到连接的想法。

              【讨论】:

                【解决方案10】:

                target.write(line1 + ' ' + line2 + ' ' + line3 + ' ')

                如果你想在同一行,上面的方法可以,如果你想在不同的行添加“\n”作为新行。

                【讨论】:

                  【解决方案11】:

                  这对我有用。

                  target.write("line1\nline2\nline3\n")

                  此外,Ewart 提到了让我点击它的关键字,“'\n' 仅在字符串文字中才有意义。”

                  【讨论】:

                    猜你喜欢
                    • 2015-02-15
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-12-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-05-20
                    • 1970-01-01
                    相关资源
                    最近更新 更多