Python 读取文件名列表,无需手动键入

Python 读取文件名列表,无需手动键入,python,Python,我有一个python代码,里面的文件名是通过输入命令接收的 文件名=输入(“请输入文件名”) 我的目的是编写一个脚本来运行这个文件。但我不想坐在那里手动输入每个文件名。是否可以在运行时将文件名作为命令行参数或其他参数 编辑:更多解释:我收到了上面一行的python代码,我应该在一些示例输入上运行这些代码。我不想更改文件或示例输入,只想在输入上自动运行文件。原因是要检查的文件很多,输入的样本也很多 import sys if len(sys.argv) > 0 filename =

我有一个python代码,里面的文件名是通过输入命令接收的

文件名=输入(“请输入文件名”)

我的目的是编写一个脚本来运行这个文件。但我不想坐在那里手动输入每个文件名。是否可以在运行时将文件名作为命令行参数或其他参数

编辑:更多解释:我收到了上面一行的python代码,我应该在一些示例输入上运行这些代码。我不想更改文件或示例输入,只想在输入上自动运行文件。原因是要检查的文件很多,输入的样本也很多

import sys

if len(sys.argv) > 0
    filename = str(sys.argv[1])
或者类似的


或者诸如此类的事情

你真的有一些选择

将stdin重定向到文件 您可能没有考虑过的一个问题是让程序保持原样,创建一个包含文件名列表的文本文件,然后将标准输入重定向到该文件。让我们将文件命名为
myfilelist.txt
。该文件将只是一个列表:

~/file1.txt
~/file2.txt
或在Windows上:

C:\file1.txt
C:\file2.txt
echo C:\file1.txt | python .\myprogram.py
echo C:\file2.txt | python .\myprogram.py
然后您可以这样调用您的程序:

python ./myprogram.py < ./myfilelist.txt
或Windows上的批处理文件:

C:\file1.txt
C:\file2.txt
echo C:\file1.txt | python .\myprogram.py
echo C:\file2.txt | python .\myprogram.py
在这里,我们执行命令
echo
使系统“打印”出一些文本,然后使用
|
(管道)告诉系统使用
echo
的输出作为其他程序的输入(而不是将文本打印到屏幕上)

列表文件参数 另一个选项是为接受单个文件路径的程序创建一个参数,然后将该文件的内容用作要处理的文件列表。这需要修改您的程序

在代码中快速而肮脏地执行此操作:

import sys
if '__main__' == __name__:
    list_file = sys.argv[1]
    with open(list_file) as f:
        for r in f:
            do_my_other_code(r)
那么你可以这样称呼它:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
调查,或类似的,使这个更干净

参数表 您可以将所有文件列为原始命令的一部分。您的代码如下所示:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
(请注意,
sys.argv[1://code>是所谓的“切片”。如果您不熟悉它们,请查阅。)

那么你会这样称呼它:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
对于你的案例,我并不特别喜欢这个选项,因为你的问题表明你有一个相当大的文件列表。键入该命令将非常繁琐且容易出错。如果电脑死机或其他什么的话,你也不会把列表保存在任何地方。但只要几个文件就可以了

另外
有很多方法可以做到这一点。这些只是几个相当简单的选项。最好的取决于你的确切用法。

你有几个选择,真的

将stdin重定向到文件 您可能没有考虑过的一个问题是让程序保持原样,创建一个包含文件名列表的文本文件,然后将标准输入重定向到该文件。让我们将文件命名为
myfilelist.txt
。该文件将只是一个列表:

~/file1.txt
~/file2.txt
或在Windows上:

C:\file1.txt
C:\file2.txt
echo C:\file1.txt | python .\myprogram.py
echo C:\file2.txt | python .\myprogram.py
然后您可以这样调用您的程序:

python ./myprogram.py < ./myfilelist.txt
或Windows上的批处理文件:

C:\file1.txt
C:\file2.txt
echo C:\file1.txt | python .\myprogram.py
echo C:\file2.txt | python .\myprogram.py
在这里,我们执行命令
echo
使系统“打印”出一些文本,然后使用
|
(管道)告诉系统使用
echo
的输出作为其他程序的输入(而不是将文本打印到屏幕上)

列表文件参数 另一个选项是为接受单个文件路径的程序创建一个参数,然后将该文件的内容用作要处理的文件列表。这需要修改您的程序

在代码中快速而肮脏地执行此操作:

import sys
if '__main__' == __name__:
    list_file = sys.argv[1]
    with open(list_file) as f:
        for r in f:
            do_my_other_code(r)
那么你可以这样称呼它:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
调查,或类似的,使这个更干净

参数表 您可以将所有文件列为原始命令的一部分。您的代码如下所示:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
(请注意,
sys.argv[1://code>是所谓的“切片”。如果您不熟悉它们,请查阅。)

那么你会这样称呼它:

#!/bin/bash
echo '~/file1.txt' | python ./myprogram.py
echo '~/file2.txt' | python ./myprogram.py
python ./myprogram.py ./myfilelist.txt
import sys
if '__main__' == __name__:
    for a in sys.argv[1:]:
        do_my_other_code(a)
python ./myprogram.py ~/file1.txt ~/file2.txt
对于你的案例,我并不特别喜欢这个选项,因为你的问题表明你有一个相当大的文件列表。键入该命令将非常繁琐且容易出错。如果电脑死机或其他什么的话,你也不会把列表保存在任何地方。但只要几个文件就可以了

另外 有很多方法可以做到这一点。这些只是几个相当简单的选项。最好的取决于您的确切用法。

您可以使用。比如说

test.py

import argparse


def main():

    in_args = _argparse()

    print(in_args)

    for a_file in in_args.file:
        ...
        #do_soomthing_with_a_file(a_file)


def _argparse():

    parser = argparse.ArgumentParser()
    parser.add_argument("file",   help="input files", type=str, nargs='+')

    args = parser.parse_args()

    return args


if __name__ == '__main__':
    main()
然后从命令行:

# a single file
marcin:test$ python test.py ./data.csv 
Namespace(file=['./data.csv'])

# multiple files
marcin:test$ python test.py ./*.* 
Namespace(file=['./data.csv', './test.py'])

# other example of multiple input files
marcin:test$ python test.py ./test.py ./data.csv 
Namespace(file=['./test.py', './data.csv'])
你可以用。比如说

test.py

import argparse


def main():

    in_args = _argparse()

    print(in_args)

    for a_file in in_args.file:
        ...
        #do_soomthing_with_a_file(a_file)


def _argparse():

    parser = argparse.ArgumentParser()
    parser.add_argument("file",   help="input files", type=str, nargs='+')

    args = parser.parse_args()

    return args


if __name__ == '__main__':
    main()
然后从命令行:

# a single file
marcin:test$ python test.py ./data.csv 
Namespace(file=['./data.csv'])

# multiple files
marcin:test$ python test.py ./*.* 
Namespace(file=['./data.csv', './test.py'])

# other example of multiple input files
marcin:test$ python test.py ./test.py ./data.csv 
Namespace(file=['./test.py', './data.csv'])

如果要将文件名或1个或多个文件名作为命令行参数,可以使用以下方法手动执行此操作:

…或者使用
argparse
,如中所示-需要做更多的工作,但要灵活得多

但是,如果您处理这些文件的唯一方法是打开它们并逐行读取,那么使用起来可能会更简单。例如:

import fileinput

for line in fileinput.input():
    do_stuff_with(line)

默认情况下,
fileinput.input
查看
argv
并逐个打开每个指定的文件,如果未指定任何文件,则从stdin读取。因此,当这正是您想要做的事情时,它可以大大简化您的代码。

如果您想将一个文件名或一个或多个文件名作为命令行参数,可以使用以下方法手动执行此操作:

…或者使用
argparse
,如中所示-需要做更多的工作,但要灵活得多

但是,如果您处理这些文件的唯一方法是打开它们并逐行读取,那么使用起来可能会更简单。例如:

import fileinput

for line in fileinput.input():
    do_stuff_with(line)

默认情况下,
fileinput.input
查看
argv
并逐个打开每个指定的文件,如果未指定任何文件,则从stdin读取。因此,当这正是您想要做的事情时,它可以大大简化您的代码。

一些解释获取命令行参数的链接:,,让我看看我是否理解正确。您希望将文件列表作为命令行参数传递并执行y