如何运行以文本文件作为输入的python文件?

时间:2014-06-08 16:12:37

标签: python command-line

所以基本上我试图在命令行中运行python文件来读取文本文件并显示信息。

我想这个问题的一部分也应该是文本文件与python文件在同一个目录中吗?

这就是我所拥有的,我认为就代码方而言,它是正确的。

  def print_words(filename):
        input_file = open(filename, 'r')
        print (input_file)

   print_words(filename)

2 个答案:

答案 0 :(得分:1)

import sys

def print_words(file_name):
    input_file = open(file_name, 'r')
    lines = input_file.readlines()
    lines = ' '.join(x for x in lines)
    print(lines)

if __name__ == '__main__':
    print_words(sys.argv[1])

filename.py文件位于同一文件夹中时,filename可以只是文件名。否则,filename的完整路径也会起作用。

edit:sys.argv [1]将第二个命令行参数作为filename。这可以是绝对的或相对的{{1}}。

例如: 在Windows中,当文件位于Python文件夹中时,您可以在命令行中调用:     c:\ Python32> python print_words.py" example.txt"

如果文件位于其他地方,则可以正常工作:     c:\ Python32> python print_words.py" C:\ FOLDER \ SUBFOLDER \ example.txt"

答案 1 :(得分:0)

编写命令行脚本以像你这样的简单要求开始(让我输入一个文件名)并很快导致更复杂的场景。

此时,一些命令行参数解析器很方便。

有很多选择,有些是:

  • sys.argv:不是命令行解析器,在更复杂的情况下无法实现
  • argparse:自Python 2.7以来stdlib的一部分,但需要多行额外代码
  • plac:非常方便实用程序脚本,除非您有更复杂的情况
  • docopt:到目前为止,我找到了处理命令行解析的最好,最干净的方法

使用docopt

解析命令行

首先安装docopt:

$ pip install docopt

然后编写脚本readfile.py

"""Read file (and possibly convert lines)
Usage:
    readfile.py [(--uppercase|--lowercase|--swapcase)] [--reverse] <filename>...
    readfile.py -h

Options:
    -U --uppercase  Convert text to uppercase
    -L --lowercase  Convert text to lowercase
    -S --swapcase   Swap character cases
    -R --reverse    Reverse text on each line

Reads file(s) <filename>, optionally convert lines to uppercase or lowercase and 
possibly reverses text of each line.

Output is printed to stdout.
"""
import string

def get_convert_func(caseconvert="keep", reverse=False):
    funcs = {"upper": string.upper, "lower": string.lower, "keep": lambda x: x}
    casefunc = funcs[caseconvert]
    if reverse:
        return lambda line: "".join(list(casefunc(line))[::-1])
    else:
        return casefunc

def printfiles(filenames, convert_func):
    for filename in filenames:
        with open(filename) as f:
            for line in f:
                print convertfunc(line.strip("\n"))

到目前为止,我们为文件和要调用的函数编写了docstring。

readfile.py继续

但真正的解析将会到来(它必须在同一个文件中,把它放到最后):

if __name__ == "__main__":
    from docopt import docopt
    args = docopt(__doc__)
    print "args", args
    filenames = args["<filename>"]
    caseconvert = "keep"
    if args["--uppercase"]:
        caseconvert = "upper"
    if args["--lowercase"]:
        caseconvert = "lower"
    reverse = args["--reverse"]
    print "--------- Converted file content: ------------"
    convertfunc = get_convert_func(caseconvert, reverse)
    printfiles(filenames, convertfunc)

尝试代码

最后试一试:

$ python readfile.py
Usage:
    readfile.py [(--uppercase|--lowercase|--swapcase)] [--reverse] <filename>...
    readfile.py -h

尝试查看更多帮助:     $ python readfile.py -h     读取文件(可能还有转换行)     用法:         readfile.py [( - uppercase | --lowercase | --swapcase)] [ - 反向] ...         readfile.py -h

Options:
    -U --uppercase  Convert text to uppercase
    -L --lowercase  Convert text to lowercase
    -S --swapcase   Swap character cases
    -R --reverse    Reverse text on each line

Reads file(s) <filename>, optionally convert lines to uppercase or lowercase and 
possibly reverses text of each line.

Output is printed to stdout.

并采取实际行动:

$ python readfile.py -UR readfile.py ../th.py
args {'--lowercase': False,
 '--reverse': True,
 '--swapcase': False,
 '--uppercase': True,
 '-h': False,
 '<filename>': ['readfile.py', '../th.py']}
--------- Converted file content: ------------
)SENIL TREVNOC YLBISSOP DNA( ELIF DAER"""
:EGASU
...>EMANELIF< ]ESREVER--[ ])ESACPAWS--|ESACREWOL--|ESACREPPU--([ YP.ELIFDAER    
H- YP.ELIFDAER    

:SNOITPO
ESACREPPU OT TXET TREVNOC  ESACREPPU-- U-    
ESACREWOL OT TXET TREVNOC  ESACREWOL-- L-    
SESAC RETCARAHC PAWS   ESACPAWS-- S-    
....etc....

最后的评论

  • 忽略执行实际操作的代码(这不重要,但不是命令行解析的例子)
  • 脚本文件应具有格式正确的docstring - 这是docopt命令行解析规则的源。必须学习这些规则,但它们并不那么困难,它们能够表达大量不同的组合。
  • docopt(__doc__)正在解析所谓的docstring,它是从脚本文件初始"""(some strint..."""部分读取的。
  • docopt解析的结果打印在输出上以显示您从解析命令行获得的字典。在生产代码中,这将被删除。
  • 示例变得更加复杂以显示灵活性(仅当我们不计算docstring时,要求一个文件名将花费我们2行代码)。最大的好处是,docopt导致将非常易读(且有效)的文档字符串作为脚本的重要部分。