所以基本上我试图在命令行中运行python文件来读取文本文件并显示信息。
我想这个问题的一部分也应该是文本文件与python文件在同一个目录中吗?
这就是我所拥有的,我认为就代码方而言,它是正确的。
def print_words(filename):
input_file = open(filename, 'r')
print (input_file)
print_words(filename)
答案 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....
docopt
命令行解析规则的源。必须学习这些规则,但它们并不那么困难,它们能够表达大量不同的组合。docopt(__doc__)
正在解析所谓的docstring,它是从脚本文件初始"""(some strint..."""
部分读取的。docopt
解析的结果打印在输出上以显示您从解析命令行获得的字典。在生产代码中,这将被删除。docopt
导致将非常易读(且有效)的文档字符串作为脚本的重要部分。