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