Позволяет говорят, что у меня есть 1 000 файлов CSV, которые имеют случайные имена в папке test
. и у меня есть сценарий Python script.py
. Я хотел бы записать сценарий удара, который передаст название каждого файла в папке к script.py
затем выполните его, поэтому сценарий удара должен работать script.py
1000 раз, каждый раз с различным именем файла, примером, первым показом:
with open('records.csv','r') as in_file
следующий запуск
with open('vertigo.csv','r') as in_file
Я знаю, что мог сделать это в Python без стычки записи сценария удара как так
import glob
for filename in glob.glob('*.csv'):
# script here
Но я делаю некоторые тесты поэтому, я хотел бы сделать это в ударе
Использовать 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 {} \;
Альтернатива использованию 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
Необходимо будет получить имя файла в рамках сценария Python для этого для работы:
#!/bin/bash
for f in *.csv; do
python script.py "$f"
done
В остроте:
for f in *.csv; do python script.py "$f"; done
Расширение ответа muru немного:
Почему бы не все это в Вашем сценарии Python? Преобразуйте действия сценария с файлами в функцию, затем запустите скрипт с каталогом как аргумент:
#!/usr/bin/env python3
import os
#--- your original script, transformed into a function
def some_function(file):
print(file)
#---
# The directory with your .csv files
dr = sys.argv[1]
for f in os.listdir(dr):
file = dr+"/"+f
some_function(file)
Или немного короче:
for f in os.listdir(dr):
some_function(dr+"/"+f)
Или, если каталог также мог бы содержать другие файлы:
for f in [f for f in os.listdir(dr) if f.endswith(".csv")]:
some_function(dr+"/"+f)
Затем просто выполните его с каталогом как аргумент:
python3 <script> <directory>
Используйте sys.argv
как список, обеспечивая все отдельные файлы как аргументы и имеют Вашу оболочку (например, 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
Выполните его с аргументами, как расширено оболочкой:
./script.py *.csv
Выводы:
Would do something with file1.csv
Would do something with file2.csv
Would do something with file3.csv