Ты senior python developer. К тебе обратился преподаватель из вуза с заданием написать скрипт на python. Проверяй себя. Не совершай ошибок, файлы *.nb не должны ломаться при открытии их при помощи wolframnb (возможно, не надо трогать кэш). Твое ТЗ: Формат скрипта: python. ОС: arch linux Формат бэкапа: если файл будет редактироваться, сделай бэкап файла в папку находящуюся в /tmp. После работы файлы бэкапа не удалять. Вывести пользователю в конце работы путь к паке бэкапа. Краткое описание работы: Скрипт заходит во все подпапки директории, указанной в ключе --wolfram_noteooks. Открывает файлы с расширением .nb, если в названии файла есть "фитирование", файл пропускается; если в этом файле "d" не стоит на первом месте (или "d" вовсе нет) скрипт скипает этот файл и говорит об этом пользователю. Рабочие файлы, структура работы: Есть файл с коэфицентами: ```txt 174-66_2-3 J=13.2851 d = 2.027 v1 = 1.7300 n1 = 0.7600 vv1 = 2.4000 nn1 = 1.1050 v2 = 1.4012 n2 = 0.5547 vv2 = 1.1338 nn2 = 0.8500 ----------------------------- 176-64_4-5 J=14.2006 d = 1.565 v1 = 1.2500 n1 = 0.8500 vv1 = 2.3000 nn1 = 1.1000 v2 = 0.8664 n2 = 0.5924 vv2 = 1.8880 nn2 = 0.6347 ----------------------------- 152-88_6-7 J=7.82676 d = 2.875 v1 = 1.63 n1 = 0.856 vv1 = 2.615 nn1 = 1.23 v2 = 2.22 n2 = 0.559 vv2 = 2.428 nn2 = 0.738 ----------------------------- 154-86_8-9 J=8.75268 d = 4.158 v1 = 1.82 n1 = 0.845 vv1 = 2.34 nn1 = 1.235 v2 = 2.157 n2 = 0.647 vv2 = 1.76 nn2 = 1.075 ----------------------------- 156-84_10-11 J=10.6271 d = 6.444 v1 = 1.635 n1 = 0.855 vv1 = 2.405 nn1 = 1.225 v2 = 1.63 n2 = 0.5571 vv2 = 1.82 nn2 = 0.675 ----------------------------- 158-82_12-13 J=11.9856 d = 2.0967 v1 = 2.1 n1 = 0.825 vv1 = 2.555 nn1 = 1.245 v2 = 1.573 n2 = 0.559 vv2 = 1.35 nn2 = 0.735 ----------------------------- 160-80_14-15 J= 11.8301 d = 1.971 v1 = 1.965 n1 = 0.805 vv1 = 2.575 nn1 = 1.195 v2 = 1.213 n2 = 0.575 vv2 = 1.35 nn2 = 0.715 ----------------------------- 162-78_16-17 J=11.9413 d = 1.92 v1 = 1.925 n1 = 0.805 vv1 = 2.5 nn1 = 1.165 v2 = 1.213 n2 = 0.57 vv2 = 1.35 nn2 = 0.695 ----------------------------- 164-76_18-19 J=12.1752 d = 1.745 v1 = 2 n1 = 0.805 vv1 = 2.65 nn1 = 1.175 v2 = 0.795 n2 = 0.595 vv2 = 1.47 nn2 = 0.655 ----------------------------- 166-74_20-21 J=12.0995 d = 1.855 v1 = 2.185 n1 = 0.755 vv1 = 2.5 nn1 = 1.165 v2 = 1.055 n2 = 0.575 vv2 = 1.51 nn2 = 0.635 ----------------------------- 168-72_22-23 J=11.8913 d = 1.9 v1 = 2.155 n1 = 0.755 vv1 = 2.62 nn1 = 1.135 v2 = 1.025 n2 = 0.575 vv2 = 1.44 nn2 = 0.645 ----------------------------- 170-70_24-25 J=11.7863 d = 1.997 v1 = 1.895 n1 = 0.785 vv1 = 2.605 nn1 = 1.125 v2 = 1.145 n2 = 0.565 vv2 = 1.5 nn2 = 0.635 ----------------------------- 172-68_26-27 J=12.0157 d = 1.973 v1 = 1.895 n1 = 0.765 vv1 = 2.605 nn1 = 1.115 v2 = 1.375 n2 = 0.545 vv2 = 1.35 nn2 = 0.655 ``` Есть файл wolfram notebook. В нем в самом начале стоит выражение d=*какое-то число*. Примерная структура файла, если "d" стоит на первом месте: ```wolfram notebook (* Content-type: application/vnd.wolfram.mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Wolfram 15.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 154, 7] NotebookDataLength[ 731705, 17288] NotebookOptionsPosition[ 687975, 16585] NotebookOutlinePosition[ 688773, 16613] CellTagsIndexPosition[ 688693, 16608] WindowFrame->Normal*) (* Beginning of Notebook Content *) Notebook[{ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"d", "=", "2.027"}]], "Input", CellChangeTimes->{ 3.991926627241884*^9, {3.9919752407542057`*^9, 3.9919752437472878`*^9}, 3.9920650045886707`*^9, {3.993120093374651*^9, 3.993120098406262*^9}, { 3.9931205775772543`*^9, 3.9931205930074*^9}, {3.99312068244851*^9, 3.993120683031312*^9}, {3.993120763928855*^9, 3.993120796207575*^9}, { 3.993120826638487*^9, 3.99312091050727*^9}, {3.993134989219914*^9, 3.99313504530585*^9}, {3.99376504479251*^9, 3.9937650448755198`*^9}, { 3.993794858519045*^9, 3.993794859582933*^9}, {3.993794914198393*^9, 3.993794918313219*^9}, {3.99379500667054*^9, 3.993795007979557*^9}, { 3.99379568990552*^9, 3.993795691164195*^9}, {3.993795875385445*^9, 3.99379588501084*^9}, {3.993797995002406*^9, 3.993797995597159*^9}, { 3.993798072981077*^9, 3.993798075654434*^9}, {3.9937986726317673`*^9, 3.9937987633828897`*^9}, {3.996019683105693*^9, 3.9960196851234617`*^9}, { 3.9960197207254753`*^9, 3.996019835558236*^9}, {3.996020358638421*^9, 3.996020431902809*^9}}, CellLabel-> "In[407]:=",ExpressionUUID->"351bbc0d-9f60-fb44-a3dd-8326f7c1a9b1"], Cell[BoxData["2.027`"], "Output", CellChangeTimes->{{3.99312071481172*^9, 3.993120733996957*^9}, 3.993120778405978*^9, {3.993120808982645*^9, 3.993120917972237*^9}, 3.993134742771702*^9, 3.993134997755999*^9, {3.9931350356393623`*^9, 3.9931350524140167`*^9}, {3.993765041622612*^9, 3.993765045540139*^9}, { 3.993794839003294*^9, 3.99379487284307*^9}, 3.993794932563972*^9, 3.993795020572113*^9, 3.993795700216778*^9, {3.993798060729582*^9, 3.9937980859991283`*^9}, 3.993798620911396*^9, {3.993798685866233*^9, 3.993798702104156*^9}, {3.993798732179296*^9, 3.993798771847027*^9}, 3.993798841155717*^9, 3.993826323633601*^9, 3.99601968768934*^9, { 3.9960197225490913`*^9, 3.9960198377988863`*^9}, {3.996020361799699*^9, 3.9960204378503847`*^9}}, CellLabel-> "Out[407]=",ExpressionUUID->"ef417a2c-223f-4508-899b-e106a590f873"] }, Open ]], Cell[CellGroupData[{ etc........ ``` Структура папок: ```stdout ./ ├── 152-88_h_Pu240_6-7 │   ├── h_152-88_h_Pu240_6-7_gid_Qw1.nb │   ├── h_152-88_h_Pu240_6-7_gid_Qw2.nb │   ├── h_152-88_h_Pu240_6-7_osc_Qw1.nb │   ├── h_152-88_h_Pu240_6-7_osc_Qw2.nb │   ├── h_152-88_h_Pu240_6-7_pr_Qw1.nb │   ├── h_152-88_h_Pu240_6-7_pr_Qw2.nb │   ├── h_152-88_h_Pu240_6-7_фитирование.nb │   └── rename.zsh ├── 154-86_h_Pu240_8-9 │   ├── h_154-86_Pu240_8-9_gid_Qw1.nb │   ├── h_154-86_Pu240_8-9_gid_Qw2.nb │   ├── h_154-86_Pu240_8-9_osc_Qw1.nb │   ├── h_154-86_Pu240_8-9_osc_Qw2.nb │   ├── h_154-86_Pu240_8-9_pr_Qw1.nb │   ├── h_154-86_Pu240_8-9_pr_Qw2.nb │   ├── h_154-86_Pu240_8-9_фитирование.nb │   └── rename.zsh ├── 156-84_h_Pu240_10-11 │   ├── h_156-84_h_Pu240_10-11_gid_Qw1.nb │   ├── h_156-84_h_Pu240_10-11_gid_Qw2.nb │   ├── h_156-84_h_Pu240_10-11_osc_Qw1.nb │   ├── h_156-84_h_Pu240_10-11_osc_Qw2.nb │   ├── h_156-84_h_Pu240_10-11_pr_Qw1.nb │   ├── h_156-84_h_Pu240_10-11_pr_Qw2.nb │   ├── h_156-84_h_Pu240_10-11_фитирование.nb │   └── rename.zsh ├── 158-82_h_Pu240_12-13 │   ├── h_158-82_h_Pu240_12-13_gid_Qw1.nb │   ├── h_158-82_h_Pu240_12-13_gid_Qw2.nb │   ├── h_158-82_h_Pu240_12-13_osc_Qw1.nb │   ├── h_158-82_h_Pu240_12-13_osc_Qw2.nb │   ├── h_158-82_h_Pu240_12-13_pr_Qw1.nb │   ├── h_158-82_h_Pu240_12-13_pr_Qw2.nb │   ├── h_158-82_h_Pu240_12-13_фитирование.nb │   └── rename.zsh ├── 160-80_h_Pu240_14-15 │   ├── h_160-80_Pu240_14-15_gid_Qw1.nb │   ├── h_160-80_Pu240_14-15_gid_Qw2.nb │   ├── h_160-80_Pu240_14-15_osc_Qw1.nb │   ├── h_160-80_Pu240_14-15_osc_Qw2.nb │   ├── h_160-80_Pu240_14-15_pr_Qw1.nb │   ├── h_160-80_Pu240_14-15_pr_Qw2.nb │   ├── h_160-80_Pu240_14-15_фитирование.nb │   └── rename.zsh ├── 162-78_h_Pu240_16-17 │   ├── h_162-78_Pu240_16-17_gid_Qw1.nb │   ├── h_162-78_Pu240_16-17_gid_Qw2.nb │   ├── h_162-78_Pu240_16-17_osc_Qw1.nb │   ├── h_162-78_Pu240_16-17_osc_Qw2.nb │   ├── h_162-78_Pu240_16-17_pr_Qw1.nb │   ├── h_162-78_Pu240_16-17_pr_Qw2.nb │   ├── h_162-78_Pu240_16-17_фитирование.nb │   └── rename.zsh ├── 164-76_h_Pu240_18-19 │   ├── h_164-76_Pu240_18-19_gid_Qw1.nb │   ├── h_164-76_Pu240_18-19_gid_Qw2.nb │   ├── h_164-76_Pu240_18-19_osc_Qw1.nb │   ├── h_164-76_Pu240_18-19_osc_Qw2.nb │   ├── h_164-76_Pu240_18-19_pr_Qw1.nb │   ├── h_164-76_Pu240_18-19_pr_Qw2.nb │   ├── h_164-76_Pu240_18-19_фитирование.nb │   └── rename.zsh ├── 166-74_h_Pu240_20-21 │   ├── h_166-74_Pu240_20-21_gid_Qw1.nb │   ├── h_166-74_Pu240_20-21_gid_Qw2.nb │   ├── h_166-74_Pu240_20-21_osc_Qw1.nb │   ├── h_166-74_Pu240_20-21_osc_Qw2.nb │   ├── h_166-74_Pu240_20-21_pr_Qw1.nb │   ├── h_166-74_Pu240_20-21_pr_Qw2.nb │   ├── h_166-74_Pu240_20-21_фитирование.nb │   └── rename.zsh ├── 168-72_h_Pu240_22-23 │   ├── h_168-72_Pu240_22-23_gid_Qw1.nb │   ├── h_168-72_Pu240_22-23_gid_Qw2.nb │   ├── h_168-72_Pu240_22-23_osc_Qw1.nb │   ├── h_168-72_Pu240_22-23_osc_Qw2.nb │   ├── h_168-72_Pu240_22-23_pr_Qw1.nb │   ├── h_168-72_Pu240_22-23_pr_Qw2.nb │   ├── h_168-72_Pu240_22-23_фитирование.nb │   └── rename.zsh ├── 170-70_h_Pu240_24-25 │   ├── h_170-70_Pu240_24-25_gid_Qw1.nb │   ├── h_170-70_Pu240_24-25_gid_Qw2.nb │   ├── h_170-70_Pu240_24-25_osc_Qw1.nb │   ├── h_170-70_Pu240_24-25_osc_Qw2.nb │   ├── h_170-70_Pu240_24-25_pr_Qw1.nb │   ├── h_170-70_Pu240_24-25_pr_Qw2.nb │   ├── h_170-70_Pu240_24-25_фитирование.nb │   └── rename.zsh ├── 172-68_h_Pu240_26-27 │   ├── h_172-68_Pu240_26-27_gid_Qw1.nb │   ├── h_172-68_Pu240_26-27_gid_Qw2.nb │   ├── h_172-68_Pu240_26-27_osc_Qw1.nb │   ├── h_172-68_Pu240_26-27_osc_Qw2.nb │   ├── h_172-68_Pu240_26-27_pr_Qw1.nb │   ├── h_172-68_Pu240_26-27_pr_Qw2.nb │   ├── h_172-68_Pu240_26-27_фитирование.nb │   └── rename.zsh ├── 174-66_h_Pu240_2-3 │   ├── h_174-66_Pu240_2-3_gid_Qw1.nb │   ├── h_174-66_Pu240_2-3_gid_Qw2.nb │   ├── h_174-66_Pu240_2-3_osc_Qw1.nb │   ├── h_174-66_Pu240_2-3_osc_Qw2.nb │   ├── h_174-66_Pu240_2-3_pr_Qw1.nb │   ├── h_174-66_Pu240_2-3_pr_Qw2.nb │   └── h_174-66_Pu240_2-3_фитирование.nb ├── 176-64_h_Pu240_4-5 │   ├── h_176-64_Pu240_4-5_gid_Qw1.nb │   ├── h_176-64_Pu240_4-5_gid_Qw2.nb │   ├── h_176-64_Pu240_4-5_osc_Qw1.nb │   ├── h_176-64_Pu240_4-5_osc_Qw2.nb │   ├── h_176-64_Pu240_4-5_pr_Qw1.nb │   ├── h_176-64_Pu240_4-5_pr_Qw2.nb │   ├── h_176-64_Pu240_4-5_фитирование.nb │   └── rename.bat ├── result_table.xlsx └── коэффициенты_Pu240_2-24.txt ``` Соответствие файла и значения "d" получается по принципу: Пример 1: - Файл: "h_154-86_Pu240_8-9_gid_Qw1.nb" - Значение "d" из секции файла с коэфициентами: 154-86_8-9; значение "d" = 4.158 Пример 2: - Файл: "h_152-88_h_Pu240_6-7_pr_Qw1.nb" - Значение "d" из секции файла с коэфициентами: 152-88_6-7; значение "d" = 2.875 Исключения: - если файл содержит в названии "фитирование", файл пропускается. - если файл НЕ содержит в названии "фитирование" и в нем d не является самой первой переменной, файл пропускается и пишется в консоль соощение о пропущенном файле и его название. Способ работы со скриптом: запуск в bash с ключами/параметрами: ```bash ./insert_d_into_nb.py --coeff_file "коэфициенты.txt" --wolfram_notebooks . ``` Задача: Поменять значения 'd' в файлах *.nb на значение из файла коэффициентов.