#python #excel #pandas #bash
#python #excel #pandas #bash
Вопрос:
Первый пост, поэтому будьте осторожны, пожалуйста.
У меня есть скрипт bash, запущенный на сервере Linux, который выполняет ежедневную загрузку файла Excel по протоколу sftp. Файл перемещается в общий ресурс Windows. Дополнительное требование возникло из-за того, что я хотел бы добавить количество строк к имени файла, которое также имеет разные временные метки каждый день. В идеале в конце перед расширением xlsx. После некоторых исследований может показаться, что я смогу сделать все это в одном скрипте, если я использую Python и один из модулей Excel. Я полный новичок в Python, но я немного поэкспериментировал и у меня есть рабочий код с использованием модуля Pandas. Вот что я работаю в тестовой электронной таблице с рабочим листом с именем mysheet и подсчитываю столбец с именем code.
>>> excel_file = pd.ExcelFile('B:PythonTest.xlsx')
>>> df = excel_file.parse('mysheet')
>>> df[['code']].count()
code 10
dtype: int64
>>> mycount = df[['code']].count()
>>> print(mycount)
code 10
dtype: int64
>>>
У меня есть 2 вопроса, пожалуйста.
Во-первых, как мне передать сегодняшнее имя файла в скрипт python, чтобы затем выполнить подсчет, и как мне вернуть это в bash. Также как мне просто вернуть значение count, например, 10 в приведенном выше примере. я не хочу, чтобы имя столбца или dtype передавались обратно.
Заранее спасибо.
Ответ №1:
Предполагая, что мы поместили ваш python в отдельный файл сценария, что-то вроде:
# count_script.py
import sys
import pandas as pd
excel_file = pd.ExcelFile(sys.argv[1])
df = excel_file.parse('mysheet')
print(df[['code']].count().at(0))
Затем мы могли бы легко вызвать этот скрипт из скрипта bash, который вызвал его в первую очередь (тот, который загружает файл).
TODAYS_FILE="PythonTest.xlsx"
# ...
# Download the file
# ...
# Pass the file into your python script (manipulate the file name to include
# the correct path first, if necessary).
# By printing the output in the python script, the bash subshell (invoking a
# command inside the $(...) will slurp up the output and store it in the COUNT variable.
COUNT=$(python count_script.py "${TODAYS_FILE}")
# this performs a find/replace on $TODAYS_FILE, replacing the ending ".xlsx" with an
# underscore, then the count obtained via pandas, then tacks on a ".xlsx" again at the end.
NEW_FILENAME="${TODAYS_FILE/.xlsx/_$COUNT}.xlsx"
# Then rename it
mv "${TODAYS_FILE}" "${NEW_FILENAME}"
Ответ №2:
Вы можете передавать аргументы командной строки в программы python, вызывая их как таковые:
python3 script.py argument1 argument2 ... argumentn
Затем к ним можно получить доступ в скрипте с помощью sys.argv
. Вы должны import sys
перед его использованием. sys.argv[0]
это имя скрипта python, а остальные — дополнительные аргументы командной строки.
В качестве альтернативы вы можете передать его в stdin, который можно прочитать на Python, используя обычные стандартные функции ввода, такие как input() . Чтобы передать ввод в стандартный формат, в bash сделайте это:
echo $data_to_pass | python3 script.py
Для вывода вы можете записать в стандартный вывод с помощью print(). Затем перенаправить вывод в bash, скажем, в файл:
echo $data_to_pass | python3 script.py > output.txt
Чтобы получить значение count в Python, вам просто нужно добавить .at(0)
в конце, чтобы получить первое значение; то есть:
df[["code"]].count().at(0)
Затем вы можете print()
отправить его в bash.