xargs, python, чтение файлов из stdin

#python #xargs

#python #xargs

Вопрос:

В каталоге с 30 CSV-файлами выполняется:

 find . -name "*.csv" | (xargs  python ~/script.py)
  

Как я могу заставить python правильно запускаться для каждого передаваемого файла xargs ? Я делаю print sys.stdin , и это всего лишь один файл. Я пробую for file in stdin цикл, но там ничего нет. Чего я не понимаю?

Комментарии:

1. Отвечая на мой собственный вопрос. fileinput Модуль — это то, где вы хотите быть: docs.python.org/library/fileinput.html

2. используйте fileinput внутри вашего скрипта на Python, и вам вообще не придется использовать какие-либо команды оболочки.

Ответ №1:

На самом деле xargs не переходит в stdin. Он передает все свои данные, прочитанные из stdin, в качестве аргументов команде, которую вы указываете в параметре.

Вы можете отлаживать вызов вашей команды с помощью echo:

 find . -name "*.csv" | (xargs echo python ./script.py)
  

Вы увидите, что все ваши файлы выводятся в одной строке.

Итак, на самом деле, чтобы получить доступ к вашим файлам из списка аргументов в python, используйте это в своем скрипте:

 import sys
for argument in sys.argv[1:]:
    print argument
  

Ответ №2:

script.py выполняется ровно один раз для каждого CSV-файла

 python ~/script.py file1.csv
python ~/script.py file2.csv
python ~/script.py file3.csv
python ~/script.py file4.csv
  

и т. д

Если вы хотите запустить его как

 python ~/script.py file1.csv file2.csv file3.csv
  

затем выполните

 python ~/script.py `find . -name "*.csv"`
  

или

 python ~/script.py `ls *.csv`
  

(«возможно, придется экранировать, не уверен)

РЕДАКТИРОВАТЬ: обратите внимание на разницу между ` и’