Python stdin文件名

时间:2013-03-07 00:27:30

标签: python filenames stdin

我正在尝试获取命令行中给出的文件名。例如:

  

python3 ritwc.py< DarkAndStormyNight.txt

我正在尝试获取DarkAndStormyNight.txt

当我尝试fileinput.filename()时,我得到了与sys.stdin相同的内容。这可能吗?我不是在寻找返回当前脚本名称的sys.argv [0]。

谢谢!

4 个答案:

答案 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脚本无关。