将文件名从 bash 传递到 python

将文件名从 bash 传递到 python

假设我的文件夹中有 1000 个具有随机名称的 csv 文件test。并且我有一个 python 脚本script.py。我想编写一个 bash 脚本,它将传递文件夹中每个文件的名称然后script.py运行它,因此 bash 脚本应该运行script.py1000 次,每次使用不同的文件名,例如,第一次运行:

with open('records.csv','r') as in_file

下一轮

with open('vertigo.csv','r') as in_file

我知道我可以用 python 来做这件事,而不需要像这样编写 bash 脚本

import glob
for filename in glob.glob('*.csv'):
   # script here

但我正在做一些测试,因此我想在 bash 中进行

答案1

使用sys.argv[1]以便从参数中获取文件名:

import sys

with open(sys.argv[1],'r') as in_file

然后,您可以使用各种方法将文件名作为参数传递。例如,使用find

find test/ -type f -name '*.csv' -exec /path/to/script.py {} \;

答案2

替代方法sys.argv是使用argparse。如果您需要更多命令行参数解析,这将非常有用。

#!/usr/bin/env python2

import argparse

def main(files):
    for f in files:
        print "Would do something with", f

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('file', nargs='+', help='path to the file')
    args_namespace = parser.parse_args()
    args = vars(args_namespace)['file']
    main(args)

使用 Bash 扩展我们的文件参数列表来运行它:

$ ./script.py *.csv
Would do something with file1.csv
Would do something with file2.csv
Would do something with file3.csv

并免费提供内置帮助:

$ ./script.py --help
usage: script.py [-h] file [file ...]

positional arguments:
  file        path to the file

optional arguments:
  -h, --help  show this help message and exit

答案3

您必须在 Python 脚本中检索文件名才能使其正常工作:

#!/bin/bash
for f in *.csv; do
    python script.py "$f"
done

一句话:

for f in *.csv; do python script.py "$f"; done

答案4

使用sys.argvas 列表,提供所有单独的文件作为参数,并让您的 shell(例如 Bash)为您扩展它。

script.py好像:

#!/usr/bin/env python2

import sys

def main(files):
    for f in files:
        print "Would do something with", f

if __name__ == "__main__":
    files = sys.argv[1:]: # slices off the first argument (executable itself)
    main(files)

文件树如下:

.
├── file1.csv
├── file2.csv
├── file3.csv
└── script.py

0 directories, 4 files

然后使其可执行:

chmod +x script.py

使用 shell 扩展的参数运行它:

./script.py *.csv

输出:

Would do something with file1.csv
Would do something with file2.csv
Would do something with file3.csv

相关内容