我正在尝试获取命令行中给出的文件名。例如:
python3 ritwc.py< DarkAndStormyNight.txt
我正在尝试获取DarkAndStormyNight.txt
当我尝试fileinput.filename()时,我得到了与sys.stdin相同的内容。这可能吗?我不是在寻找返回当前脚本名称的sys.argv [0]。
谢谢!
答案 0 :(得分:4)
通常无法以平台无关的方式获取文件名。其他答案涵盖了合理的替代方案,例如在命令行上传递名称。
在Linux和一些相关系统上,您可以通过以下技巧获取文件的名称:
import os
print(os.readlink('/proc/self/fd/0'))
/proc
/是Linux上的一个特殊文件系统,它提供有关计算机上进程的信息。 self
表示当前正在运行的进程(打开文件的进程)。 fd
是一个目录,包含进程中每个打开文件描述符的符号链接。 0是stdin
的文件描述符号。
答案 1 :(得分:2)
你可以使用ArgumentParser
,它会自动为你提供命令行参数的界面,甚至可以提供帮助等等。
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('fname', metavar='FILE', help='file to process')
args = parser.parse_args()
with open(args.fname) as f:
#do stuff with f
现在你致电python2 ritwc.py DarkAndStormyNight.txt
。如果你在没有参数的情况下调用python3 ritwc.py
,它会给出一个错误,说明它是FILE
的预期参数。您现在也可以致电python3 ritwc.py -h
,它会说明需要file to process
。
PS这是一个很好的介绍如何使用它:http://docs.python.org/3.3/howto/argparse.html
答案 2 :(得分:1)
事实上,当从控制台重定向stdin时,python无法看到该文件名,因此您可以选择:
像这样打电话给你的程序:
python3 ritwc.py -i your_file.txt
然后添加以下代码以从python内部重定向stdin,以便您可以通过变量“filename_in”访问文件名:
import sys
flag=0
for arg in sys.argv:
if flag:
filename_in = arg
break
if arg=="-i":
flag=1
sys.stdin = open(filename_in, 'r')
#the rest of your code...
如果现在使用命令:
print(sys.stdin.name)
你得到你的文件名;但是,当您从控制台重定向stdin后执行相同的打印命令时,您将得到结果:<stdin>
,这将证明python无法以这种方式查看文件名。
答案 3 :(得分:0)
我不认为这是可能的。就你的python脚本而言,它正在写入stdout。您正在捕获写入stdout的内容并将其写入shell中的文件这一事实与python脚本无关。