【问题标题】:Python String QueryPython 字符串查询
【发布时间】:2016-06-02 13:45:55
【问题描述】:

我最近制作了一个 Twitter 机器人,它获取指定的 .txt 文件并逐行将其发送出去。我在程序中内置的许多功能来解决一些格式问题实际上允许程序处理几乎任何文本文件。

我想建立一个功能,我可以“导入”一个 .txt 文件来使用。

我把它放在引号中是因为程序此时在命令行中运行。

我认为有两种方法可以解决这个问题,但每种方法都需要一些指导:

A) 我以询问用户要使用哪个文件的提示开始程序。这被存储为一个字符串(让我们说变量字符串),代码看起来像这样-

file = open(string,'r')

有两个主要问题。第一个是如果指定的程序拼写错误或不存在,我不确定如何防止程序崩溃。第二个是它不会与未来的发展相吻合(最终我想围绕这个程序构建应用程序功能)

B) 在命令行中以某种方式指定所需的文件。虽然程序仍然偶尔会崩溃,但对用户来说并没有那么不便。此外,这将有助于未来的开发,因为通过命令行传递值比内部提示更容易。

有什么想法吗?

【问题讨论】:

    标签: python twitter bots


    【解决方案1】:

    对于问题的第一部分,异常处理是要走的路。虽然对于第二部分,您也可以使用名为 argparse 的模块。

    import argparse
    
    # creating command line argument with the name file_name   
    parser = argparse.ArgumentParser()
    parser.add_argument("file_name", help="Enter file name")
    args = parser.parse_args()
    # reading the file
    with open(args.file_name,'r') as f:
        file = f.read()
    

    您可以在其文档页面上阅读有关 argparse 模块的更多信息。

    【讨论】:

      【解决方案2】:

      关于 A),您可能需要调查

      try:
          with open(fname) as f:
              blah = f.read()
      except Exception as ex:
          # handle error
      

      对于 B) 你可以,例如

      import sys
      fname = sys.argv[1]
      

      您还可以将两者结合起来以确保用户已传递参数:

      #!/usr/bin/env python
      # encoding: utf-8
      import sys
      
      def tweet_me(text):
          # your bot goes here
          print text
      
      if __name__ == '__main__':
          try:
              fname = sys.argv[1]
              with open(fname) as f:
                  blah = f.read()
              tweet_me(blah)
          except Exception as ex:
              print ex
              print "Please call this as %s <name-of-textfile>" % sys.argv[0]
      

      以防万一有人想知道# encoding: utf-8 行。这允许源代码包含utf-8 字符。否则只允许使用 ASCII,这对于这个脚本来说是可以的。所以这条线是没有必要的。但是,我正在对脚本本身进行测试 (python x.py x.py),并且作为一个小测试,添加了 utf-8 评论 (# ä)。在现实生活中,您将不得不更加关心输入的字符编码...

      但是请注意,仅捕获可能来自整个程序的任何Exception 并不被视为良好的编码风格。虽然 Python 鼓励做出最好的假设并 try 它,但在它们发生的地方捕获可预期的错误可能是明智的。例如,访问不存在的文件将引发IOError。你可能会得到类似的结果:

          except IndexError as ex:
              print "Syntax: %s <text-file>" % sys.argv[0]
          except IOError as ex:
              print "Please provide an existing (and accessible) text-file."
          except Exception as ex:
              print "uncaught Exception:", type(ex)
      

      【讨论】:

      • except Exception 非常糟糕,我会指定会发生什么异常以及除了它。 (不在 PC 上,所以无法测试,类似于 FileError)
      • 它旨在将 OP 引入一个新概念并鼓励自己的研究。
      • 然后我会在答案中提到它的风格不好,并且可能链接到一些关于异常类型的文章
      • 这是真的。我会相应地更新答案,以便对未来的访问者更有帮助。
      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2011-05-14
      • 2012-03-14
      • 2012-01-14
      • 2011-08-02
      相关资源
      最近更新 更多