我正在尝试对文件夹中的所有文本文件执行python脚本:
for fi in sys.argv[1:]:
我收到以下错误
-bash: /usr/bin/python: Argument list too long
我称之为Python函数的方式如下:
python functionName.py *.txt
该文件夹包含大约9000个文件。有没有办法运行此功能,而不必将我的数据拆分到更多的文件夹等?拆分文件不太实用,因为我将来必须在更多文件中执行该功能...谢谢
编辑:根据所选的正确回复和回复者(Charles Duffy)的评论,对我有用的是:
printf '%s\0' *.txt | xargs -0 python ./functionName.py
因为我没有有效的shebang ..
答案 0 :(得分:5)
这是一个操作系统级别的问题(限制命令行长度),并且通常使用操作系统级别(或者至少是Python之外的过程)解决方案来解决:
find . -maxdepth 1 -type f -name '*.txt' -exec ./your-python-program '{}' +
...或...
printf '%s\0' *.txt | xargs -0 ./your-python-program
请注意,每发现一批文件运行your-python-program
一次,批量大小取决于ARG_MAX
中可以容纳的名称数量;如果这不合适,请参阅MarcusMüller的优秀答案。
答案 1 :(得分:2)
没有。这是命令行长度(以字节为单位)的内核限制。
通常,您可以通过执行
来确定该限制getconf ARG_MAX
,至少对我来说,产生2097152(字节),这意味着大约2MB。
我建议您自己使用python来处理文件夹,即让您的python程序能够使用目录而不是单个文件,或者从文件中读取文件名。
前者可以使用os.walk(...)
轻松完成,而第二种选择(在我看来)更灵活。使用argparse
模块为您的python程序提供易于使用的命令行语法,然后添加文件类型的参数(请参阅参考文档),python将自动能够理解特殊文件名,如{{ 1}},意思是你可以代替
-
DO
for fi in sys.argv[1:]
甚至可以让你做类似
的事情for fi in opts.file_to_read_filenames_from.read().split(chr(0))
答案 2 :(得分:1)
不要这样做。将掩码传递给python脚本(例如将其称为python functionName.py "*.txt"
)并使用glob(https://docs.python.org/2/library/glob.html)展开它。
答案 3 :(得分:1)
我考虑使用glob
模块。使用此模块,您可以调用您的程序,如:
python functionName.py "*.txt"
然后shell不会将*.txt
扩展为文件名。 Python程序将在参数列表中收到*.txt
,您可以将其传递给glob.glob()
:
for fi in glob.glob(sys.argv[1]):
...