Передайте имя файла от удара до Python

Позволяет говорят, что у меня есть 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

Но я делаю некоторые тесты поэтому, я хотел бы сделать это в ударе

2
задан 10 July 2015 в 20:21

5 ответов

Использовать 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 {} \;
6
ответ дан 2 December 2019 в 01:25

Альтернатива использованию 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
ответ дан 2 December 2019 в 01:25

Необходимо будет получить имя файла в рамках сценария Python для этого для работы:

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

В остроте:

for f in *.csv; do python script.py "$f"; done
1
ответ дан 2 December 2019 в 01:25

Расширение ответа 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>
2
ответ дан 2 December 2019 в 01:25

Используйте 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
2
ответ дан 2 December 2019 в 01:25

Другие вопросы по тегам:

Похожие вопросы: