не работает выбор через input и if
При вводе(через input) 1 и 0 все ровно выдает 1
<code>
class FirstClass:
    def FirstDef(self):
        print('0 или 1:')
        inpt = input()
        if inpt == 0:
            print('Hello, 0')
        elif inpt != 1:
            print('Hello, 1')

p = FirstClass()
p.FirstDef()
</code>

У тебя в elif inpt != 1, что можно перевести как - "Если inpt не равно 1."
Просто измени != на ==
UPD
Также возможно ещё проблема в типе получаемого значения
Попробуй
inpt = int(input()). Это преобразует получаемое значение из input в целочисленный тип int


Удвоить слова в строке с разделителями, в которых есть хотя бы одна буква отличная от букв в данном слове
Проблема заключается в разделении входной строки на слова.
Есть входная строка состоящая из слов и разделительных символов и есть некое слово, надо каждое слово внутри строки удвоить, если в нем есть хотя бы одна буква отличная от букв в слове. Проблема заключается в разделении входной строки на слова. Дальше понимаю как сделать, но для этого нужен такой список, чтобы проверить каждую букву из каждого элемента списка на вхождение в данное слово.
Вот начало моего кода:
<code>
razd = str(',;:.?!')
razd = razd + '"' + "'"
slovo = input()
stroka = input()
for i in stroka:
    if i in razd:
        stroka = stroka.split(sep=i)
</code>

Приведите пример входных данных, а то по описанию пока не совсем понятно.
В общем виде можно всегда использовать регулярные выражения.
<code>
import re

slovo = 'погода'
stroka = 'пог/ушёл:;иду'

bad_words = []

slova_iz_stroki = re.findall(r'[a-zA-Zа-яА-ЯёЁ0-9]+', stroka)

for sl in slova_iz_stroki:
    status = 0
    for bukva in sl:
        if bukva in slovo:
            continue
        else:
            status += 1
    if status > 0:
        bad_words.append(sl)

for slv in bad_words:
    stroka = stroka.replace(slv, slv*2)

print(stroka)
</code>


Проверка на "дурака" с возвратом a=int(a) python
Есть конструкция:

while True:
try:
    a = input("Введите ваш возраст: ")
    if int(a) < 18:
        print("Доступ запрещен.")
        break
    elif int(a) >= 18:
        print("Доступ разрешен.")
        break
    else:
        raise ValueError
except ValueError:
    continue

Как можно преобразовать эту штуку таким образом, чтобы в try не прописывать постоянно int(a) для сравнения чисел. Да и вообще для любых операций?
Или подойдет такая тема:

while True:
    a = input("Введите возраст: ")
    if not a.isnumeric():
        continue
    else:
        a = int(a)
        break

if a < 18:
    print("Доступ запрещен.")
elif a >= 18:
    print("Доступ разрешен.")

Может, Вам подойдёт такой способ?:
<code>
while True:
    try:
        age = int(input('Введите ваш возраст: '))
        break
    except ValueError:
        continue

if age < 18:
    print('Доступ запрещен.')
else:
    print('Доступ разрешен.')
</code>


Как передать дополнительный параметр в map python
Всем привет! Подскажи, есть ли возможность в python передать параметр в map
<code>
with Pool(10) as p:
    try: info = p.map(get_info_hubr, links)
    except: info = []

def get_info_hubr(link:str)->dict:
    """
    Получаем данные со статьи
    """

    hubr_parser = HubrParser(link)
    name_article = hubr_parser.get_name()
    author = hubr_parser.get_authors()
    links = hubr_parser.get_links()
    date = hubr_parser.get_date()
    subjects = hubr_parser.get_subjects()

    return create_dict(name_article, date, author, link, links, subjects)
</code>
Идея такова: хочу передавать парсер (объект парсера) в качестве параметра в метод get_info_hubr для того что бы метод был не зависим от конкретной реализации парсера. В данном случае реализация для ресурса Hubr, но так же есть реализации под другие ресурсы

Возможно поможет использование
lambda

def get_info_hubr(hubr_parser: HubrParser, link:str)->dict:
    pass  # Оставляем почти без изменений

#------------------

parser_object = HubrParser()
with Pool(10) as p:
   try: info = p.map(lambda link: get_info_hubr(parser_object, link), links)
   except: info = []

Кроме того, можно использовать
functools.partial, в сущности это та же
lambda, но немного быстрее, если верить ответу, а также во многих случаях, код становится более читаемый.
Например

def get_info_hubr(hubr_parser: HubrParser, link:str)->dict:
    pass  # Оставляем почти без изменений

#-----------
from functools import partial

with Pool(10) as p:
    try: info = p.map(partial(get_info_hubr, hubr_parser=HubrParser()), links)
    except: info = []


Почему не удаляется файл методом модуля Pathlib?
Мне нужно удалить файл на Python3. Для этого я выбрал модуль pathlib и выполнил следующий код:
<code>
from pathlib import Path

path = 'C:/Users/101ap/Desktop/Player/picture1.png'

Path.unlink(path)
</code>
После чего получил ошибку:

AttributeError: 'str' object has no attribute '_closed'

Пожалуйста, подскажите, что делаю неправильно?

Попробуйте так:
<code>
from pathlib import Path

path = Path('C:/Users/101ap/Desktop/Player/picture1.png')
path.unlink()
</code>


Django. Не передается результат одной из функций из вьюхи в шаблон
Дано:

views.py

в котором содержатся 2 функции, парсящие списки. Одна - список бранчей в проекте Gitlab, вторая - тянет список методов:

from django.shortcuts import render
from django.conf import settings
import cx_Oracle
import subprocess

def method_list(request):
    settings.configure()
    con = cx_Oracle.connect('USER', 'PaSsWoRd', 'work.rus')
    cursor = con.cursor()
    sql = 'select * from (select distinct class_id from methods order by 1) where rownum <20'
    cursor.execute(sql)
    result = cursor.fetchall()
    parsed_methods_string = str(result).replace('(\'', '').replace('[', '').replace(', ', '').replace(']', '').replace('\',)', '\n')
    parsed_methods = parsed_methods_string.split('\n')[:-1]
    print(parsed_methods)
    return render(request, 'blog/branch_list.html', {'parsed_methods': parsed_methods})

def branch_list(request):
    result = subprocess.run("gitlab project-branch list --project-id 3", stdout=subprocess.PIPE, encoding='utf-8', shell=True).stdout
    br_list = result.replace('\n\n', '\n').replace('\n\n', '\n').replace('name: ', '').replace(', ', '\n')
    parsed_branches = br_list.split('\n')[:-1]
    print(parsed_branches)
    return render(request, 'blog/branch_list.html', {'parsed_branches': parsed_branches})

urls.py

from django.urls import path
from . import views
from . import models

urlpatterns = [
    path('', views.branch_list, name='branch_list'),
    path('', views.method_list, name='method_list')
]

И шаблон

branch_list.html

    <!DOCTYPE html>
    <html lang="ru">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
            <title>Загрузка</title>
        </head>
        <body>
            <p>Выберите метод для загрузки</p>
            <p>{{ parsed_methods }}</p>
            <div class="method">
                <select>
                          {% for a in parsed_methods  %}
                    <option>{{ a }}</option>
                          {% endfor %}
                </select>
            </div>
            <p>Выберите бранч для загрузки</p>
            <p>{{ parsed_branches }}</p>
            <div class="branch">
                <select>
                          {% for a in parsed_branches  %}
                    <option>{{ a }}</option>
                          {% endfor %}
                </select>
            </div>
        </body>
    </html>

Т.е., распарсены оба списка, но в шаблон не передается лист из функции
method_list
Собственно, не могу понять ЧЯДНТ?

в return 1 функции

return render(request, 'blog/branch_list.html', {'parsed_branches': parsed_methods})

замените на

return render(request, 'blog/branch_list.html', {'parsed_methods': parsed_methods})

это точно должно помочь

 def method_list(request):
    settings.configure()
    con = cx_Oracle.connect('USER', 'PaSsWoRd', 'work.rus')
    cursor = con.cursor()
    sql = 'select * from (select distinct class_id from methods order by 1) where rownum <20'
    cursor.execute(sql)
    result = cursor.fetchall()
    parsed_methods_string = str(result).replace('(\'', '').replace('[', '').replace(', ', '').replace(']', '').replace('\',)', '\n')
    parsed_methods = parsed_methods_string.split('\n')[:-1]
    print(parsed_methods)

    result_brunch = subprocess.run("gitlab project-branch list --project-id 3", stdout=subprocess.PIPE, encoding='utf-8', shell=True).stdout
    br_list = result_brunch.replace('\n\n', '\n').replace('\n\n', '\n').replace('name: ', '').replace(', ', '\n')
    parsed_branches = br_list.split('\n')[:-1]
    print(parsed_branches)
    return render(request, 'blog/branch_list.html', {'parsed_methods': parsed_methods, 'parsed_branches': parsed_branches})


Как сохранить изменения объекта при выходе из цикла python
Имеется list, состоящий из dict`ов
Мне нужно оставить только те словари, в которых values() определенных ключей
соответствуют условию.
Я сделал цикл который в общем-то выполняет эту функцию:

list = [{},{},{}]
for i in list:
    for a in i.values():
        if a == 'no':
            print(i)

В консоль действительно выводятся значения, которые мне нужно удалить.
Но когда я делаю так:

list = [{},{},{}]
for i in list:
    for a in i.values():
        if a == 'no':
            list.remove(i)
print(list)

Я получаю первоначальный список без каких-либо изменений.
Вопрос в том, как мне обновить список с учетом изменений, ведь если я запущу его внутри цикла - он будет принтиться тысячи раз

Во-первых, никогда внутри цикла не меняйте тот список, по которому идёт этот цикл. Ваш код будет пропускать часть словарей, которые вы хотели удалить. (Хотя какие-то он всё-таки должен удалить, так что мне не верится, что на выходе вы получаете список вообще без изменений)
Во-вторых, сразу приучайтесь использовать такие возможности языка, как списковые включения. Особенно если речь идёт просто о фильтрации списка, делать такое циклом - не самое удачное решение.

data = [{},{'a': 'no'},{}]

wrong_dict = lambda dct: 'no' in dct.values()

data = [item for item in data if not wrong_dict(item)]

print(data)

UPD: И, кстати, не используйте слово
list в качестве имени переменной - это название встроенной функции, его перезапись может привести к неожиданным спецэффектам в коде.


В строке не dict, а json (об этом говорит, в частности, true и false с маленькой буквы). Для декодирования в dict нужно использовать модуль json:

import json

a = '{"result":true,"data":{"*|Free_Wi-Fi":[]},"time": 0.038449048995972}'

decoded = json.loads(a)

Если это ответ с API какого-то сайта, полученный с помощью
requests, то можно из ответа запроса брать не поле
r.text, а вызвать метод
r.json(), тогда сразу получите
dict:

r = requests.post(...)
result = r.json()


Анализ автообновляемых логов c Python
Нужно организовать анализ логов, в которые чуть ли не каждую секунду добавляются строки. У меня появилось две проблемы:

После каждого перезапуска программы, она создаёт новый файл с логами в формате
<дата>_<время>.log. Можно ли как то сделать так, чтобы скрипт открывал именно последний лог файл?
Как можно сделать так, чтобы скрипт запоминал последнюю проанализированную строку и при следующем цикле начинал со следующей, пропустив предыдущие?

Мой код на данный момент:

while True:
  print('analyse logs...')
  f = open('test.txt', 'r')
  logs = f.readlines()
  f.close()
  for line in logs:
    if ('executed' in line) or ('for test' in line):
      print(line)
    time.sleep(60)

После каждого перезапуска программы, она создаёт новый файл с логами в
  формате <дата>_<время>.log. Можно ли как то сделать так, чтобы скрипт
  открывал именно последний лог файл?

Нужно получить список файлов, распарсить их, и вытащить файл, чья дата наибольшая.
Я придумал файлы с форматом
%d%m%y_%H%M%S.log:

logs/
    110220_113400.log
    130220_113400.log
    130220_120000.log
    131219_113446.log

А теперь парсим их названия:

import datetime as DT
from glob import glob
from pathlib import Path

logs = glob('logs/*_*.log')
print(logs)
# ['logs\\110220_113400.log', 'logs\\130220_113400.log', 'logs\\130220_120000.log', 'logs\\131219_113446.log']

for file_name in logs:
    date_str = Path(file_name).stem
    print(date_str, DT.datetime.strptime(date_str, '%d%m%y_%H%M%S'), sep=' -> ')
# 110220_113400 -> 2020-02-11 11:34:00
# 130220_113400 -> 2020-02-13 11:34:00
# 130220_120000 -> 2020-02-13 12:00:00
# 131219_113446 -> 2019-12-13 11:34:46

Код разбора имени в дату перенесем в отдельную функцию и используем ее в функции
max для получения максимального элемента по дате:

def get_datetime_from_log_file_name(file_name):
    date_str = Path(file_name).stem
    return DT.datetime.strptime(date_str, '%d%m%y_%H%M%S')

...

last_log = max(logs, key=get_datetime_from_log_file_name)
print(last_log)
# logs\130220_120000.log

Как можно сделать так, чтобы скрипт запоминал последнюю
  проанализированную строку и при следующем цикле начинал со следующей,
  пропустив предыдущие?

Сохраняйте последнюю строку в памяти. Это будет работать пока скрипт запущен. Либо сохраняйте в файле и при запуске приложения считывайте из файла. А так, создайте переменную
last_line инициируйте ее
None, в цикле проверяйте, ее значение с текущей строкой и пропускайте строки, что не проходят ее. А после цикла
for актуализируйте
last_line.
Примерно так:

last_line = None

while True:
    print('analyse logs...')
    with open('test.txt') as f:
        logs = f.readlines()

    for line in logs:
        if last_line is not None:
            # Если текущая строка является последней, то сбросим флаг, чтобы не было
            # проверки last_line и продолжим разбор со следующей строки
            if last_line == line:
                last_line = None

            # Пропускаем текущие строки пока задан last_line
            continue

        if ('executed' in line) or ('for test' in line):
            print(line)

    last_line = line

    time.sleep(60)


Перенос нужных значений в отдельный JSON
Подскажите, как из одного JSON файла выбрать определенные значения (ключ:значение) и записать их в другой JSON?
Пример имеющегося JSON файла:

{
"type": "bundle",
"spec_version": "2.0",
"id": "bundle--5dd695fb-cf04-41b1-b800-1542ac103a14",
"objects": [
    {
        "type": "identity",
        "id": "identity--5ba50d3b-25c8-490c-a9c0-2238ac103a14",
        "identity_class": "organization",
        "modified": "2019-11-21T13:49:48.012Z",
        "name": "info_about_host",
        "created": "2019-11-21T13:49:48.012Z"
    },
    {
        "type": "report",
        "object_refs": [
            "indicator--5dd695f6-84a4-4e1a-9486-1541ac103a14"
        ],
        "created_by_ref": "identity--5ba50d3b-25c8-490c-a9c0-2238ac103a14",
        "id": "report--5dd695f6-5f84-4fe7-84a5-1541ac103a14",
        "labels": [
            "Report",
            "networkgenius:tool=\"networkgenius\""
        ],
        "published": "2019-11-21T13:49:43Z",
        "modified": "2019-11-21T13:49:48.037Z",
        "name": "info_about_IP",
        "created": "2019-11-21T00:00:00.000Z"
    },
    {
        "type": "indicator",
        "description": "Attribute found on page 1 of info_about_host",
        "valid_from": "2019-11-21T00:00:00Z",
        "created_by_ref": "identity--5ba50d3b-25c8-490c-a9c0-2238ac103a14",
        "id": "indicator--5dd695f6-84a4-4e1a-9486-1541ac103a14",
        "labels": [
            "networkgenius:type=\"ip\"",
            "networkgenius:category=\"Network settings\"",
            "networkgenius:to_export=\"True\""
        ],
        "pattern": "[network-traffic:dst_ref.type = 'ipv4-addr' AND network-traffic:dst_ref.value = '127.127.127.127']",
        "modified": "2019-11-21T13:49:48.013Z",
        "created": "2019-11-21T13:49:48.013Z"
    }
]

}
Нужные значение:

    "labels": [
        "networkgenius:type=\"ip\"",
        "networkgenius:category=\"Network settings\"",
        "networkgenius:to_export=\"True\""
    ],
    "pattern": "[network-traffic:dst_ref.type = 'ipv4-addr' AND network-traffic:dst_ref.value = '127.127.127.127']"

Спасибо!

В файле test.json исходные данные из примера.
<code>
import json

with open("test.json", "r") as f:
    data = json.load(f)

objects_list= data.get('objects')

new_json = dict()
for c_obj_dict in objects_list:
    if c_obj_dict['type'] == "indicator":
        new_json['labels'] = c_obj_dict.get('labels')
        new_json['pattern'] = c_obj_dict.get('pattern')

with open("result.json", "w") as f:
    json.dump(new_json, f)
</code>


Удаление строк в DataFrame на основе регулярных выражений
Я совсем недавно начал заниматься с Python и Pandas и столкнулся с проблемой.
У меня есть файл на 60к строк, в нем содержатся смс, которые отправляла наша компания в течении месяца.

import pandas as pd

# Это небольшой список регулярок на основе которых я провожу поиск.
regex_list = [r'Код подтверждения:', r'ВНИМАНИЕ! НЕОЖИДАННОЕ КОЛИЧЕСТВО СОБЫТИЙ!.*', r'Для получения подотчета в кассе .* в размере .\d+ руб\D сообщите код кассиру: \d{1,6}', r'Активность .*: Факт.значение: .*. Нужное значение: .*']

# Новые названия колонок.
new_name = ['message', 'operator', 'sms_amount', 'price', 'traffic']

df = pd.read_csv('November.csv', sep=";", decimal=',')

# Дропаем не нужные нам колонки.
df.drop(['Дата отправки', 'Группа отправителя', 'ФИО отправителя',
         'Номер отправителя', 'ФИО получателя', 'Номер получателя',
         'Дата доставки', 'Канал отправки', 'Теги', 'ТД', 'Тип',
         'Статус доставки'],
        axis='columns', inplace=True)

# Ренейм.
df.set_axis(new_name, axis='columns', inplace=True)

# Пропуски в колонке Цена меняем на 0
df['price'] = df['price'].fillna(0)

#Добавляем столбец с общей стоимостью.
df.loc[0, 'total_sum'] = (df['price'] * df['sms_amount']).sum()

А дальше, мне нужно удалить из исходного файла (либо из его копии), те строки, для которых было найдено вхождение.
Для поиска я использовал

df[df['message'].str.contains(r'{}'.format(row))]

в цикле и он прекрасно ищет, но как удалить найденные строки из исходного файла я не представляю.

Добавить логическое не
~ и по поиску каждой регулярки оставлять те, кто не подходит под паттерн.

df = df[~df['message'].str.contains(r'{}'.format(row))]

А можно обойтись без цикла for и сделать регулярку с ИЛИ под каждый случай

df = df[~df['message'].str.contains('|'.join(regex_list))]


Использование button в tkinter [дубликат]

На этот вопрос уже дан ответ здесь:

Почему команда в кнопке выполняется сразу после запуска программы, и не при нажатии на кнопку?

                                (1 ответ)

Закрыт 3 года назад.

Столкнулся с проблемой, что при передаче command в Button функции, она выполняется до срабатывания даже mainloop. Можно ли как то этого избежать?
Пример:
<code>
def submit(entry):
    a = entry.get()
    if a == 'Enter smth':
        messagebox.showerror('Ошибка', 'Введите число')
        return
    else:
        foo(a)

entry = Entry(main)
entry.insert(0,'Enter smth')

run = Button(main,
             text=" Enter ",
             command=submit(entry)
             )

main.mainloop()
</code>
mainloop() не выполняется, при обработке command программа сразу переходит в функцию, видит, что в поле введена строка и выводит ошибку, после чего закрывает програму.

Просто в кнопке надо заменить
command = submit(entry) на
command = lambda: submit(entry) и все хорошо запашет.


Определить класс Окружность. Реализовать проверку пересечения с другой окружностью в виде метода. Переопределить метод сравнения с учетом радиуса
Создал класс окружности , вроде правмильно написал сравнение двух объектов класса, но я не знаю как написать сравнение двух объектов одного класса в методе этого класса
<code>
import math
class Circle:
    def __init__(self,x,y,radius):
        self.x = x
        self.y = y
        self.radius = radius
cir1 = Circle(3,5,2)
cir2 = Circle(7,8,2)
if cir1.x == cir2.x:
    if cir1.radius + cir2.radius > abs(cir1.y - cir2.y):
        print('Окружности пересекаются')
    else:
        print('Окружности не пересекаются')
elif cir1.y == cir2.y:
    if cir1.radius + cir2.radius > abs(cir1.x - cir2.x):
        print('Окружности пересекаются')
    else:
        print('Окружности не пересекаются')
else:
    if (cir1.radius + cir2.radius)**2 > abs((cir1.x - cir2.x)**2 - (cir1.y - cir2.y)**2):
         print('Окружности пересекаются')
    else:
        print('Окружности не пересекаются')
</code>
Как реализовать метод и переопределить его , не знаю , нигде по этому поводу ничего не нахожу, и сам додуматься не могу.

import math

class Circle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius

    def persechenie(self,cir):
        if self.x == cir.x:
            if self.radius + cir.radius > abs(self.y - cir.y):
                print('Окружности пересекаются')
            else:
                print('Окружности не пересекаются')
        elif self.y == cir.y:
            if self.radius + cir.radius > abs(self.x - cir.x):
                print('Окружности пересекаются')
            else:
                print('Окружности не пересекаются')
        else:
            if (self.radius + cir.radius) ** 2 > abs((self.x - cir.x) ** 2 - (self.y - cir.y) ** 2):
                print('Окружности пересекаются')
            else:
                print('Окружности не пересекаются')

cir1 = Circle(3, 5, 2)
cir = Circle(7, 8, 2)
cir1.persechenie(cir)


Почему метод QPixmap модуля PyQt5 не принимает в качестве аргумента переменную, содержащую строку?
Недавно я задавал здесь вопрос - Как закруглить края кнопки, которая не имеет рамки и полностью состоит из изображения?(Python3, PyQt5).
Получил очень развернутый ответ со сложным для меня кодом. Когда я разбирал его, попытался сделать так, чтобы класс Label мог принимать путь к изображению в качестве аргумента, т.к. до этого путь был прописан внутри этого класса.
Это привело меня к ошибке:

TypeError: QPixmap(): argument 1 has unexpected type 'Window'

Пожалуйста, скажите, где я ошибся?
Я изменил код следующим образом:
<code>
import sys
from PyQt5 import QtWidgets, QtCore, QtGui

class Label(QtWidgets.QLabel):
    clicked = QtCore.pyqtSignal()

    def __init__(self, picture, antialiasing=True): # <--- Аргумент picture, который
                                                # я хочу передать копии класса Label
                                                # в классе Window
        super(Label, self).__init__()
        self.picture = picture
        self.Antialiasing = antialiasing
        self.setMaximumSize(140, 140)
        self.setMinimumSize(140, 140)
        self.radius = 10

        self.target = QtGui.QPixmap(self.size())
        self.target.fill(QtCore.Qt.transparent)

        p = QtGui.QPixmap(picture).scaled( # <--- Передаю аргумент picture методу QPixmap()
            140, 140, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation)

        painter = QtGui.QPainter(self.target)
        if self.Antialiasing:
            painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
            painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
            painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)

        path = QtGui.QPainterPath()
        path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
        painter.setClipPath(path)
        painter.drawPixmap(0, 0, p)
        self.setPixmap(self.target)

    def mouseReleaseEvent(self, event):
        self.clicked.emit()

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.label = Label(self, 'picture1.png') # <--- Передаю путь
        self.label.clicked.connect(self.onClicked)

        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.label)
        self.setStyleSheet("background: green;")

    def onClicked(self):
        print('Вы сделали клик')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.resize(400, 400)
    w.show()
    sys.exit(app.exec_())
</code>

Вы не правильно передаете параметры
Замените
self.label = Label(self, 'picture1.png')   на
self.label = Label('picture1.png', self)


Как разделить строку в Python с сохранением разделителя?
Есть строка
привет\n\nземля. Хочу разделить строку по разделителю
\n.

z = text.split('\n')

на выходе получается

привет
\n
земля

а мне нужно

привет
\n
\n
земля

То есть чтобы дублирующий разделитель не удалялся

Используйте str.splitlines([keepends]) с флагом
keepends=True, тогда разделители останутся:

text = 'привет\n\nземля'
print(text.splitlines(keepends=True))
# ['привет\n', '\n', 'земля']

UPD. Немного доработки для разделения
\n от элементов:

text = 'привет\n\nземля'
lines = []
for line in text.splitlines(keepends=True):
    if len(line) > 1 and line.endswith('\n'):
        lines.extend([line[:-1], '\n'])
    else:
        lines.append(line)

print(lines)
# ['привет', '\n', '\n', 'земля']


Убрать пунктирную обводку, возникающую после нажатия на кнопку
При нажатии на кнопку в моей программе кнопка приобретает пунктирную обводку, я не знаю как ее убрать.
<code>
from tkinter import *

import tkinter

from tkinter import ttk

from tkinter import messagebox

root = tkinter.Tk()
root.geometry("512x512")
root.title("Вход")

def faq():
    messagebox.showinfo("text 1", "text 2")

btn = ttk.Button(text = "Пустая кнопка")
btn.grid(column = 1, row = 1)
btn2 = ttk.Button(text = "?",
    width = 3,
    command = faq)
btn2.grid(column = 2, row = 1)

root.mainloop()
</code>

Пунктиром выделяется объект, содержащий фокус. Можно после нажатия принудительно переводить фокус на все окно:
<code>
def faq():
    messagebox.showinfo("text 1", "text 2")
    root.focus()
</code>


Почему default-аргумент не перезаписывается?
Скажите пожалуйста, почему в следующем коде на третьем вызове функции f() значение l становится [0, 1]

def f(x, l=[]):
    print('=====', l)
    for i in range(x):
        l.append(i*i)
    print(l)

f(2)
f(3, [3, 2, 1])
f(3)

Вывод:

===== []
[0, 1]
===== [3, 2, 1]
[3, 2, 1, 0, 1, 4]
===== [0, 1]
[0, 1, 0, 1, 4]

Есть ли этому логическое объяснение? Это можно запомнить, но хотелось бы именно понять.
Ход моей мысли такой:

функция f() при первом вызове заполняет l значением [0, 1]
при втором вызове функции f() значение l перезаписывается. То есть
предыдущее значение удаляется
теоретически при третьем вызове в l должно содержаться или [] или
[3, 2, 1, 0, 1, 4]
НО там содержится [0, 1]. ОТКУДА?..

при втором вызове функции f() значение l перезаписывается. То есть
  предыдущее значение удаляется

Нет. Как раз в этом Вы и заблуждаетесь. Значение
l остаётся прежним, а функция использует переданное значение.

НО там содержится [0, 1]. ОТКУДА?..

Изменённое стандартное значение
l после первого вызова функции.

Чтобы подтвердить мною сказанное, давайте дизассемблируем код (последние 2 вызова):

 10          20 LOAD_NAME                0 (f)
             22 LOAD_CONST               3 (3)
             24 LOAD_CONST               3 (3)
             26 LOAD_CONST               2 (2)
             28 LOAD_CONST               4 (1)
             30 BUILD_LIST               3
             32 CALL_FUNCTION            2
             34 POP_TOP

 11          36 LOAD_NAME                0 (f)
             38 LOAD_CONST               3 (3)
             40 CALL_FUNCTION            1
             42 POP_TOP

Обратите внимание на инструкцию
CALL_FUNCTION. Её описание:

CALL_FUNCTION(argc)
  Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов.

Когда Вы вызывали функцию, заменяя стандартный аргумент, происходило следующее:

             32 CALL_FUNCTION            2
#                                       ^^^

Python для вызова брал 2 аргумента из стека.
l вообще не участвует при вызове и тем более не перезаписывается.
Когда Вы не передавали второй аргумент,
Python брал его из объекта функции (брал
l):

             40 CALL_FUNCTION            1
#                                       ^^^


Остается последняя запись в БД django
Мне нужно чтобы водители привязывались к юзеру(У юзера может быть много водителей).  В таком виде у меня записывается только одна запись на юзера. Как мне можно сделать много записей на юзера?
<code>
class Policyholder(models.Model):
    name = models.CharField("Имя", max_length = 64)
    familyname = models.CharField("Фамилия", max_length = 64)
    father_name = models.CharField("Отчество", max_length = 64)
    driver_age = models.IntegerField("Возвраст")
    experience = models.IntegerField("Стаж")
    admin = models.OneToOneField(User , on_delete=models.CASCADE)
</code>

Кажется проблема в последней строке OneToOneField.
Используйте ForeignKey.
P.S. для поля 1-1 создается также ограничение unique. Чтобы его снять, нужно сделать миграцию


Python.Рекурсия.Двоичные числа
<code>
def printBin(num):
if num < 0:
    print('-', end='')
num = abs(num)
if num == 0:
    return
if num > 0:
    printBin(num // 2)
    print(num % 2, end="")
</code>
Если изначальное число равно 0, то в таком случае функция реторнит None.
Что надо сделать,чтоб при вводе 0 реторнился 0, используя лишь метод рекурсии, при этом не используя иных функций?

Дело в том, что последний вызов нужно делать для числа большего 1. А печать должна быть отложенной, после завершения рекурсивного вызова.
<code>
def printBin(num):
    if num < 0:
        print('-', end='')
    num=abs(num)
    if num >1:
        printBin(num // 2)
    print(num % 2, end='')
</code>


Как в джанго вывести сложную модель даных?
У меня есть 3 связных (1 модель связана с 2 моделью, а 2 модель с 3 моделью) модели:
<code>
class languages(models.Model):
    language = models.CharField('описание', max_length=1000, db_index=True)
class directorys(models.Model):
    language = models.ForeignKey(languages, on_delete = models.CASCADE, verbose_name='Язык')
    description = models.CharField('описание', max_length=1000, db_index=True)
class file_directory(models.Model):
    directory = models.ForeignKey(directorys, on_delete = models.CASCADE, verbose_name='Католог')
    description = models.CharField('описание', max_length=1000, db_index=True)
</code>
Как их можно вывести
Я пробовал через батарейку django-mptt, но почитав документацию, понял, что он не может так выводить

ну если имелось ввиду все на одной странице то как-то так
views.py

from .models import  languages

def lang(request):
    all_lang = languages.objects.all()
    return render(request, 'имя_вашего_приложения/lang.html', {'all_lang': all_lang })

и в шаблоне
lang.html

{% extends 'base.html' %}
{% block title %} Название_страницы {% endblock %}
{% block content %}

{% for a in all_lang %}
    <h1>{{a.language}}</h1>
        {% for b in a.directorys_set.all %}
            <ul>{{b.description}}</ul>
                    {% for c in b.file_directory_set.all %}
                        <li>{{c.description}}</li>
                    {% endfor %}
        {% endfor %}
 {% endfor %}
 {% endblock %}

К связанным моделям обращаются через ключевое слово
_set
читайте официальную документацию
Ну и наверное, все же поля разных моделей стоит называть по разному, а то потом возникнет путаница, где какое


Неправильный результат выполнения программы
Не могу понять, в чём заключается ошибка. Программа должна в массиве найти элементы, кратные 5, затем уменьшить их на 2 и вывести полученный массив. Выводит не то, что нужно. Буду благодарна, если поможете найти ошибку.
<code>
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
j = 2
for i in a:
    if i % 5 == 0:
        k = i - j
        a.insert(k, a.index(i))
        a.remove(i)
print(a)
</code>

Вообще говоря, нехорошо модифицировать список, по которому вы итерируетесь. Это может привести к неожиданным эффектам. Поэтому лучше генерировать новый список на основе старого:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print([x - 2 if x % 5 == 0 else x for x in a])

Результат:

[1, 2, 3, 4, 3, 6, 7, 8, 9, 8]

P.S. enumerate не нужен, это я прогнал :)
P.P.S. Если вы не делаете вставку и удаление в итерируемый список, а только меняете элементы по индексу, то так делать в принципе можно (хотя это тоже зависит от внутренней реализации списка в языке, лучше так делать не со списками, а с массивами фиксированного размера, например numpy array):

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for (i,x) in enumerate(a):
  if x % 5 == 0:
     a[i] -= 2
print(a)


Преобразование раскладок клавиатуры
Всех приветствую.
Использую такую функцию для нажатия клавиши в определенное окно:
<code>
win32gui.PostMessage(self.hwnd, win32con.WM_KEYDOWN, WINDOW_ID, 0)
</code>
Проблема такая:
мне необходимо набрать русский текст, но функция PostMessage принимает только английские клавиши для нажатия.
Но, допустим, если включить русскую раскладку клавиатуры и нажать через postMessage на Q - то нажмется уже "Й".
Как можно преобразовать русские символы клавиатуры в английские? Типа:

ПРИВЕТ -> GHBDTN

Может, есть какая-нибудь таблица для этого?

Вот рабочий способ перевода из русской раскладки в английскую:
<code>
x = str(input()) #Само слово, если не подходит, то надо поменять под ваш вариант
a = {'Й':'Q','Ц':'W','У':'E','К':'R','Е':'T',
    'Н':'Y','Г':'U','Ш':'I','Щ':'O','З':'P',
    'Х':'{','Ъ':'}','Ф':'A','Ы':'S','В':'D',
    'А':'F','П':'G','Р':'H','О':'J','Л':'K',
    'Д':'L','Ж':':','Э':'"','Я':'Z','Ч':'X',
    'С':'C','М':'V','И':'B','Т':'N','Ь':'M',
    'Б':'<','Ю':'>','Ё':'~','й':'q','ц':'w',
    'у':'e','к':'r','е':'t','н':'y','г':'u',
    'ш':'i','щ':'o','з':'p','х':'[','ъ':']',
    'ф':'a','ы':'s','в':'d','а':'f','п':'g',
    'р':'h','о':'j','л':'k','д':'l','ж':';',
    'э':"'",'я':'z','ч':'x','с':'c','м':'v',
    'и':'b','т':'n','ь':'m','б':',','ю':'.',
    'ё':'`'} #Список со всеми значениями
res = '' #Создание пустой строки
j = 0 #Используется для выбора определённой буквы из x
while j < len(x): #Пока j < длинны строки x выполняется цикл
    if x[j] in a: #Если в списке a есть буква из x под номером j, выполняется перевод в английскую раскладку
        i = a[x[j]]
        res += i
        j+=1
    else: #Иначе добавляет пробел
        res+= ' '
print(res) #Выводит результат в консоль(если не подходит, то меняйте под свой случай)
</code>

Код может полностью вам не подходить, если что меняйте, но основную суть кода я расписал.


Python. Конвертировать кодировку в раскодированный текст
Ситуация требует кодировать и декодировать текст, записанный, например, в 'utf-16' кодировке путём написания декодируемого текста в input
Результат программы должен выглядеть так:

Ваш текст: b'\xff\xfeB\x04'

Раскодированный текст: т

Код сейчас:

input_txt = input('Ваш текст: ')
x = input_txt.decode()
y = x.decode(encoding='utf-16',errors='ignore')
print('\nРаскодированный текст: ' + str(y))

К сожалению, это не работает корректно

При вводе
b'\xff\xfeB\x04' через
input фактически получается такая строка:
"b'\\xff\\xfeB\\x04'". Перед декодированием ее нужно разобрать ее как литерал (т.е. перевести в набор байт
b'\xff\xfeB\x04' в данном случае). Для этого можно использовать функцию
ast.literal_eval:

import ast

input_txt = input('Ваш текст: ')
print(repr(input_txt))  # "b'\\xff\\xfeB\\x04'"
x = ast.literal_eval(input_txt)
print(repr(x))  # b'\xff\xfeB\x04'
y = x.decode(encoding='utf-16',errors='ignore')
print('\nРаскодированный текст: ' + y)


Упорядочить список по типу содержимого?
Есть список:
[1, 3, 5, 'adf', 34, (1, 5, 8)]. Хочу упорядочить его по типу содержимого, чтобы сначала шли целые числа, строка и в конце кортеж.
То есть получить на выходе:
[1, 3, 5, 34, 'adf', (1, 5, 8)].
Как добиться этого?

Можно использовать сортировку со своим компаратором и для него задать возврат значений как приоритет по типу.
Пример:

TYPE_BY_PRIORITY = {
    int: 0,
    str: 1,
    tuple: 2,
}

items = [1, 3, 5, 'adf', 34, (1, 5, 8)]
items.sort(key=lambda x: TYPE_BY_PRIORITY.get(type(x)))
print(items)
# [1, 3, 5, 34, 'adf', (1, 5, 8)]

UPD.
Чтобы сортировка без ошибок обрабатывала типы, что нет в
TYPE_BY_PRIORITY, то в
.get нужно возвращать значение по умолчанию:

items.sort(key=lambda x: TYPE_BY_PRIORITY.get(type(x), 99))

UPD2.
Как подсказал MaxU, можно в компараторе возвращать кортеж вида
(приоритет, значение), тогда сортировка будет и по типу, и по значению (будет порядок для элементов одного типа):

items.sort(key=lambda x: (TYPE_BY_PRIORITY.get(type(x), 99), x))

Это заметно с выборкой
[3, 1, 5, 'adf', 34, (1, 5, 8)]. Компаратор только с приоритетом вернет
[3, 1, 5, 34, 'adf', (1, 5, 8), 2.2], а компаратор с приоритетом и значением вернет:
[1, 3, 5, 34, 'adf', (1, 5, 8)]


Как сделать resample в timeseries на основании изменении значения?
У меня есть timeseries
Вот пример:
<code>
                                    p
time
2017-01-03 09:30:00.083000-05:00    74.6100
2017-01-03 09:30:00.505000-05:00    74.9900
2017-01-03 09:30:05.469000-05:00    74.7919
2017-01-03 09:30:08.555000-05:00    74.5000
2017-01-03 09:30:10.927000-05:00    74.9000
</code>
Значения в столбце 'p' иногда не меняются при изменении 'time'.
Я хочу сделать следующее:
Алгоритм должен идти по DataFrame и:

Если цена ('p') на следующем шаге такая же, как и на предыдущем - мы оставляем в DataFrame только первое значение.
Если цена на следующем шаге изменилась по сравнению с предыдущим - мы записываем его в DataFrame

Получается, что мы делаем resample на основании изменения цены, но шаг изменения не имеет значения.
Помогите понять, как это сделать?
Спасибо

Воспользуйтесь DataFrame.drop_duplicates():
<code>
df = df.drop_duplicates(subset=["p"], keep="first")
</code>


Добавление новых данных в DataFrame pandas
Есть такой код

a = {'a': [1, 3, 4], "b": [1, 1, 1]}

b = {'b': 1, 'c': 3}

df = pd.DataFrame(a)

Как к существующему DataFrame добавить новый словарь и получить:

a  | b | c
==========
1  | 1 | NaN
3  | 1 | NaN
4  | 1 | NaN
NaN| 1 | 3

Т.е. я добавляю новый словарь, который может содержать ключи, которых ранее не было, и мне надо на новую строчку добавить все данные из нового словаря. Вместо NaN можно и просто пустоту, или 0
Вопрос: как лаконично это можно сделать?

In [19]: df = df.append(b, ignore_index=True)

In [20]: df
Out[20]:
     a    b    c
0  1.0  1.0  NaN
1  3.0  1.0  NaN
2  4.0  1.0  NaN
3  NaN  1.0  3.0


Flask. Как динамически задавать приглашения в форме
Делаю загрузку файлов, хотя это не важно. Вот обычный вариант работает:

from flask_wtf import Form
from wtforms import FileField, SubmitField, ValidationError

class UploadForm(Form):
    xl_data_file = FileField('Задайте *.xls файл')
    submit = SubmitField('Отправить')

Все работает. Мне хочется на разных ветках использоватиь разные подсказки 'Задайте *.xls файл',  'Задайте *.doc файл', 'Задайте *.jpg файл'. Не подскажите как это сделать?
Я попробовал так:

class UploadForm(Form):
def __init__(self, text):
    self.xl_data_file = FileField(f'Задайте *.{text} файл')
    self.submit = SubmitField('Отправить')

При этом заменив где надо
form = UploadForm() на
form = UploadForm(file). Но получил ошибку
AttributeError: 'UploadForm' object has no attribute '_fields'  во время выполнения...
В нете про эту ошибку я за 15 минут ничего не нарыл (возможно потому что я новичек в Flask).
Итого два вопроса.
1) как получить желаемое
2) что это за ошибка
...
Конечно, я могу создать три класса.)
Видимо, необходимо запустить родной инит, так как я "переписал" его.
Вариант

class UploadForm(Form):
def __init__(self, text):
    super().__init__()
    self.xl_data_file = FileField('Задайте *.xls файл')
    self.submit = SubmitField('Отправить')

не выводит форму, а вариант

class UploadForm(Form):
def __init__(self, text):
    super().__init__(self)
    self.xl_data_file = FileField('Задайте *.xls файл')
    self.submit = SubmitField('Отправить')

выдает ошибку
AttributeError: 'UploadForm' object has no attribute 'getlist'

class UploadForm(Form):
    # Поля обязательно нужно оставить среди переменных самого класса
    xl_data_file = FileField('Задайте *.xls файл')
    submit = SubmitField('Отправить')

    # Можно объявить свой init, но не объявлять в нем поля формы
    def __init__(self, text=None):
        super().__init__()
        if text:
            # А переопределить атрибут label у существующего поля
            self.xl_data_file.label.text = text

В коде обработчиков, перед тем, как отобразить шаблон:

form = UploadForm('Задайте *.doc файл')
# Даже так, если на ходу передумал, тогда и init не нужен
form.xl_data_file.label.text = 'Задайте *.ptt файл'


Как закрыть программу после закрытия Messagebox?
Как можно осуществить закрытие программы после закрытия Messagebox в tkinter? Закрытие самой программы происходит с помощью библиотеки sys и команды
sys.exit(). Но вот проблема в том как эту команду связать с закрытием диалогового окна?

import tkinter as tk
from tkinter import messagebox
import sys

root = tk.Tk()

def mess():
    mess = messagebox.showinfo("Кнопка нажата!!!",'После нажатия ОК программа закроется!!!')

root.bind("<Button-1>", lambda event: mess())

root.mainloop()

Надо было посмотреть что оставляет после закрытия. В моём случае - ok. Таким образом выходит:
<code>
import tkinter as tk
from tkinter import messagebox
import sys

root = tk.Tk()

def mess():
    mess = messagebox.showinfo("Кнопка нажата!!!",'После нажатия ОК программа закроется!!!')
    if mess == 'ok':
        sys.exit()

root.bind('<Button-1>', lambda event: mess())

root.mainloop()
</code>


django Ошибка при добавлении статьи в базу данных
Я написал статью, и когда пытаюсь ее сохранить в базу данных, возникает следующая ошибка:

OperationalError at /admin/polls/post/5/add/

index row requires 12552 bytes, maximum size is 8191

models.py:

body = RichTextField(blank=True, db_index=True)

Можно ли как-то расширить эту индексную строку? Или есть другой способ решения данной проблемы?

Максимальный размер индксируемого столбца в PostgreSQL составляет 8191 байт. Текст, который вы хотите сохранить в этом поле, весит 12552. Вам действительно нужно индексировать это поле? Это не самая хорошая идея.
Как простое решение, предлагаю, просто удалить параметр
db_index=True у этого столбца.


Поиск связей на основе множественных данных
Есть вот такая задачка. Имеем определенные данные, на основе этих данных необходимо найти связь по типу Alpha - Gamma.
Условия следующие:

alpha['code'] != beta['code'] and list(set(alpha['cls']) & set(beta['cls']))

(и так со всеми "узлами" от Alpha до Theta); если связь Alpha - Gamma разрешена, то Gamma - Alpha уже запрещена (связь возможна только в одностороннем порядке); количество связей для каждого "узла" не должно превышать значений
linkMax и не должно быть ниже значений
linkMin.
Ума не приложу как оформит это, кроме как в примере кода. Есть какие-то более удобные варианты? Выручайте. Заранее спасибо.

comp_list = ['Альфа', 'Бета', 'Гамма', 'Дельта', 'Эпсилон', 'Дзета', 'Эта','Тета']
    linkMin = [2, 2, 2, 2, 2, 2, 2, 2]
    linkMax = [4, 4, 4, 4, 4, 4, 4, 4]
    i_v_list = [5000000, 1000000, 8000000, 15000000, 1900000, 49420, 7840000, 10200000]
    f_v_list = [2500, 7800000, 15000000, 4700, 9378000, 6940000, 9863420, 800]
    i_t_list = [2082292, 41717791, 57455285, 7886851, 39717241, 31947667, 35374341, 39077395]
    o_t_list = [7079792, 34917791, 50455285, 22882151, 32239241, 25057087, 33350921, 49276595]
    cod_list = [5445, 4205, 5405, 5405, 2464, 9204, 9204, 2464]

alpha_cls = [432100, 192000, 421100, 932990]
beta_cls = [521000, 466900, 842509, 711210]
gamma_cls = [521000, 421100, 842509, 711210]
delta_cls = [0, 412000, 711210, 932990]
epsilon_cls = [467100, 421100, 521000, 711210]
zeta_cls = [192000, 466900, 711210]
eta_cls = [842509, 421100, 521000, 932990]
theta_cls = [421100, 466900, 711210, 932990]

alpha = {'name': comp_list[0], 'code': cod_list[0], 'cls': alpha_cls}
beta = {'name': comp_list[1], 'code': cod_list[1], 'cls': beta_cls}
gamma = {'name': comp_list[2], 'code': cod_list[2], 'cls': gamma_cls}
delta = {'name': comp_list[3], 'code': cod_list[3], 'cls': delta_cls}
epsilon = {'name': comp_list[4], 'code': cod_list[4], 'cls': epsilon_cls}
zeta = {'name': comp_list[5], 'code': cod_list[5], 'cls': zeta_cls}
eta = {'name': comp_list[6], 'code': cod_list[6], 'cls': eta_cls}
theta = {'name': comp_list[7], 'code': cod_list[7], 'cls': theta_cls}

nodes = (alpha, beta, gamma, delta, epsilon, zeta, eta, theta)

if alpha['code'] != beta['code'] and list(set(alpha['cls']) & set(beta['cls'])):
    print('Link possible')
else:
    print('Link impossible', alpha['name'], '-', beta['name'])

if alpha['code'] != gamma['code'] and list(set(alpha['cls']) & set(gamma['cls'])):
    print('Link possible', alpha['name'], '-', gamma['name'])
else:
    print('Link impossible', alpha['name'], gamma['name'])


Проблема со списком
Требуется получить список из N списков, состоящих из символов английского алфавита:

[[N], [N, N-1], [N, N-1, N-2], ... ]

Например, для N = 5 должен быть результат:

[['e'], ['e', 'd'], ['e', 'd', 'c'], ['e', 'd','c', 'b'], ['e', 'd', 'c', 'b', 'a']]

А получается:

[['e', 'd', 'c', 'b', 'a'], ['e', 'd', 'c', 'b', 'a'], ['e', 'd', 'c', 'b', 'a'], ['e', 'd','c', 'b', 'a'], ['e', 'd', 'c', 'b', 'a']]

Подскажите, в чем косяк.

size = int(input())

alphabet = 'abcdefghijklmnopqrstuvwxyz'
alpha_list = list(alphabet)

symbols = []
first_symbols = []

for i in range (size-1, -1, -1):
    symbol = alpha_list[i]
    symbols.append(symbol)
    first_symbols.append(symbols)

print(first_symbols)


Помощь в написании программы Python
Есть необходимость в создании конвертера величин.
<code>
import math

print ('''
Выберете желаемое действие:
_____________________________
1 - конвертация из дБм в мВт
2 - конвертация из дБм в В
3 - конвертация из мВт в дБм
4 - конвертация из В в дБм
0 - Выход
_____________________________
''')

var=int(input())
while var==0:
    print ("Завершение работы программы.")
    break
if var==1:
    print ("Введите требуемый уровень сигнала, дБм:")
    dBm = float (input())
    mWt = (10 ** (dBm/10))
    print ("Текущая мощность:", "%.2f" % mWt, "мВт")
elif var==2:
    print ("Введите значение dBm:") # заданное значение сигнала в dBm
    Rf = float (input())
    V = ((Rf+120)/40)
    if Rf<-100:
        print ("Низкое значение dBm")
    elif Rf>-10:
        print ("Высокое значение dBm")
    else:
        print ("Необходимое значение V:", V, "V")
elif var==3:
    print ("Введите мощность mWt:")
    mWt = float (input())
    dBm = 10*math.log(mWt, 10)
    print ("Результат:", "%.2f" % dBm, "dBm")
elif var==4:
    print ("Введите значение напряжения V:") # показания мультиметра
    V = float (input())
    Rf = 40 * V - 120
    if V<0.5:
        print ("Низкое значение напряжения")
    elif V>2.9:
        print ("Высокое значение напряжения")
    else:
        print ("Текущий уровень сигнала:", Rf, "dBm")
elif var!=0 or va!=1 or var!=2 or var!=3 or var!=4:
    print ("Введите одно из предложенных значений")
</code>
по отдельности каждая функция работает, но по завершении работы - программа закрывается. Как сделать, чтобы по завершению работы функции предлагалось заново выбрать один из предложенных вариантов?

Просто зациклите все условия.
Например:
<code>
import math

print ('''
Выберете желаемое действие:
_____________________________
1 - конвертация из дБм в мВт
2 - конвертация из дБм в В
3 - конвертация из мВт в дБм
4 - конвертация из В в дБм
0 - Выход
_____________________________
''')

while True:
    try:
        var = int(input())
    except ValueError:
        print("Введите одно из предложенных значений")
        continue

    if var == 0:
        print("Завершение работы программы.")
        break
    elif var == 1:
        print("Введите требуемый уровень сигнала, дБм:")
        dBm = float (input())
        mWt = (10 ** (dBm/10))
        print("Текущая мощность:", "%.2f" % mWt, "мВт")
    elif var == 2:
        print ("Введите значение dBm:") # заданное значение сигнала в dBm
        Rf = float (input())
        V = ((Rf+120)/40)
        if Rf<-100:
            print ("Низкое значение dBm")
        elif Rf>-10:
            print ("Высокое значение dBm")
        else:
            print ("Необходимое значение V:", V, "V")
    elif var == 3:
        print ("Введите мощность mWt:")
        mWt = float (input())
        dBm = 10*math.log(mWt, 10)
        print ("Результат:", "%.2f" % dBm, "dBm")
    elif var == 4:
        print ("Введите значение напряжения V:") # показания мультиметра
        V = float (input())
        Rf = 40 * V - 120
        if V<0.5:
            print ("Низкое значение напряжения")
        elif V>2.9:
            print ("Высокое значение напряжения")
        else:
            print ("Текущий уровень сигнала:", Rf, "dBm")
    else:
        print("Введите одно из предложенных значений")
</code>


Получение элемента из кортежа MultiIndex DataFrame
Изучаю вопрос, можно ли получить конкретный элемент из кортежа MultiIndex.
Имею DataFrame с построенным MultiIndex:

test = {'UID' : ('00000639616', '00000675306', '00000675305','00000639617', '00000675301', '00000675302'),
          'ID': ('02ab9161', '02ab9162', '02ab9163','02ab9164', '02ab9165', '02ab9166 '),
        'АНДС': (True, True, True, False, True, False),
        'Дата': ('2019-01-01', '2020-01-01', '2021-01-01','2019-01-01', '2020-01-01', '2021-01-01'),
'Бизнес-Линия': ('Сегмент1', 'Сегмент1', 'Сегмент1', 'Сегмент1', 'Сегмент1','Сегмент1')}

df_test = pd.DataFrame(test)
df_test.set_index(['ID', 'АНДС', 'Дата'], inplace=True)
df_test.sort_index(ascending=True, inplace=True)

Выглядит DataFrame так:

                                    Расчет          Бизнес-Линия
ID        АНДС     Дата
02ab9161  True     2019-01-01       00000639617     Сегмент1
02ab9162  True     2020-01-01       00000675306     Сегмент1
02ab9163  True     2021-01-01       00000675306     Сегмент1
02ab9164  False    2019-01-01       00000639617     Сегмент1
02ab9165  True     2020-01-01       00000675306     Сегмент1
02ab9166  False    2021-01-01       00000675306     Сегмент1

Cлучайным образом выбираю одну строку:

example = df_test.sample(1)

Получаю образец (example) со следующим индексом:

ID        АНДС     Дата             Расчет          Бизнес-Линия
02ab9161  True     2019-01-01       00000639617     Сегмент1

MultiIndex([('02ab9161', True, '2019-01-01')],
           names=['ID', 'АНДС', 'Дата'])

Задача:
Определить
id_client из полученного example:
'02ab9161'

Решаю так:

idclient=example.index[0][0]

Недостаток такого подхода в жесткой привязке к положению. Исследую вопрос, можно ли сделать как-то так:

idclient=example.index['ID']

То есть, получить конкретный элемент индекс по названию столбца, а не по слайсу элемента.

Попробуйте так:
<code>
In [13]: example
Out[13]:
                                    UID Бизнес-Линия
ID        АНДС  Дата
02ab9166  False 2021-01-01  00000675302     Сегмент1

In [14]: id_client = example.index.get_level_values("ID")[0]

In [15]: id_client
Out[15]: '02ab9166 '
</code>


Python 3. Помогите решить задачу
Всем привет.
Наткнулся в учебнике "Как устроен Python. Мэтт Хариссон"
на упражнение:
Создайте переменную name и присвойте ей свое имя.
Создайте другую переменную — second_half, которая проверяет,
находится ли первая буква name во второй половине алфавита.
Что необходимо для того, чтобы выполнить сравнение?
Логически я понимаю, какие команды, функции и операторы надо использовать,
но сформулировать в код не получается.
Я новичок в программирование, и мне проще учиться на примерах.
Товарищи знатоки, покажите пожалуйста как реализовать данную задачу в рабочий код. Спасибо.

import string

name = 'Anton'
second_half = name[0].upper() in string.ascii_uppercase[len(string.ascii_uppercase)//2:]

1) Импортируем модуль string
2) В модуле string есть строка ascii_uppercase, вот что в ней хранится:
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
3) Переменную second_half мы определяем с помощью логического выражения, в котором проверяется, находится ли первая буква имени во второй половине ascii_uppercase.
Обязательно приводим первую букву к верхнему регистру с помощью метода .upper(), потому что если вдруг буква будет в нижнем регистре, логическое выражение всегда будет выдавать False.


Сортировка по двум / нескольким критериям
Требуется функцией sorted вернуть список, отсортированный по двум критериям, как это сделать?
К примеру есть список строк, которые надо отсортировать по длине, а строки одной длины в алфавитном порядке между собой

есть список строк, которые надо отсортировать по длине, а строки одной
  длины в алфавитном порядке между собой

Пример:

In [29]: strings = ['cc', 'aa', 'bbb', 'aaa', 'ddd', 'bb']

In [30]: sorted(strings, key=lambda x: (len(x), x))
Out[30]: ['aa', 'bb', 'cc', 'aaa', 'bbb', 'ddd']

Другой пример - сортируем список списков сначала по второму элементу (по возрастанию), а потом по третьему элементу (по убыванию):

In [37]: data = [["Max", "Mustermann", 66], ["John", "Doe", 33], ["Janie ", "Doe", 44]]

In [38]: sorted(data, key=lambda x: (x[1], -x[2]))
Out[38]: [['Janie ', 'Doe', 44], ['John', 'Doe', 33], ['Max', 'Mustermann', 66]]

Менее тривиальный пример - сортируем список имен и фамилий - сначала сортируем по фамилии в алфавитном порядке, затем по имени в обратном порядке:

In [47]: data = [["Max", "Mustermann"], ["John", "Doe"], ["Janie", "Doe"], ["Abigale", "Doe"]]

In [48]: sorted(data, key=lambda x: (x[1], [-ord(c) for c in x[0]]))
Out[48]: [['John', 'Doe'], ['Janie', 'Doe'], ['Abigale', 'Doe'], ['Max', 'Mustermann']]


Почему возникает ошибка с записью в базу данных SQLite3?(Python3)
Я делал оконное приложение на Python 3 с помощью модуля PyQt5. Мне нужно записывать информацию в базу данных
SQLite3 внутри потока. Я пытался сделать это, но в ответ получил ошибку:

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 7384 and
  this is thread id 6520.

Вот сам код:

# -*- coding: utf-8 -*-
import sqlite3
from PyQt5 import QtCore, QtWidgets

con = sqlite3.connect('database.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS info(info1 TEXT,
                                               info2 TEXT)''')
con.commit()

def write_info():
    info1 = 'one'
    info2 = 'two'
    cur.execute('INSERT INTO info VALUES(?, ?)', (info1, info2))
    con.commit()

class MyThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
    def run(self):
        print('THREAD: run')
        write_info()

class MyWindow(QtWidgets.QWidget):

    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.vbox = QtWidgets.QVBoxLayout()
        self.button = QtWidgets.QPushButton('Button')
        self.vbox.addWidget(self.button)
        self.button.clicked.connect(self.button_f)
        self.setLayout(self.vbox)

    def button_f(self):
        self.mythread = MyThread(self)
        self.mythread.started.connect(self.on_started)
        self.mythread.finished.connect(self.on_finished)
        self.mythread.start()

    def on_started(self):
        print('THREAD: start')

    def on_finished(self):
        print('THREAD: finish')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle(' ')
    window.show()
    sys.exit(app.exec_())

Пожалуйста, подскажите, что я делаю неправильно?

В подключении к базе данных добавьте это:
<code>
conn = sqlite3.connect('database.db', check_same_thread=False)
</code>


Как определить столкновение шаров?
Как можно определить столкновение двух шаров в Canvas? То есть эти два шара двигаются, но когда их оболчки сталкиваются, надо чтобы они шли в обратных направлениях. Как сделать это движение обратно я знаю, но не получается зафиксировать их столкновкние.

Вспоминаем курс математики=)
Центры шаров не могут быть ближе, чем r1 + r2. Если они ближе - значит шары пересекаются.
По теореме Пифагора находим расстояние между центрами.

l = sqrt( (x1 - x2)^2 + (y1 - y2)^2 )

И потом если
l <= r1 + r2 - делаем то что нужно.


Python ошибка в синтаксисе
не могу разобраться, где в коде ошибка
<code>
import random
print("для выхода напишите.")

while True
a = input("ведите вопрос:")
number = random.randint(1,5)
if(a = .)
    break
if(number = 1)
    print("да")
if(number = 2)
    print("нет")
if(number = 3)
    print("и да и нет")
if(number = 4)
    print("скорее да чем нет")
if(number = 5)
    print("скорее нет чем да")
</code>

Много ошибок:

while True

отсутствует двоеточие (
:) в конце. Правильно:

while True:

a = input("ведите вопрос:")

Это и последующие команды должны быть в цикле
while True:, значит, должны быть отступы. Правильно:

    a = input("ведите вопрос:")

if(a = .)

Три ошибки в этой строке, и во всех похожих первые 2 из них:

отсутствует двоеточие (
:) в конце,
оператор сравнения не
=, а
==,
точка (
.) должна быть в кавычках, потому что это не число, а символ, так:
".",
скобки не нужны (но могут быть — это не является ошибкой).

Правильно:

if a == ".":


как покрасить ввод?
Как покрасить input в python? (при помощи colorama либо termcolor)
print краситься отлично

from colorama import Fore, Back, Style, init
init()

print(Fore.RED + 'test')

но если провернуть такое с input он не покрасится

from colorama import Fore, Back, Style, init
init()

input(Fore.RED + 'test')

Заранее спасибо


Как сохранить на компьютер фото, отправленное пользователем?
Пользователь отправляет фото боту. Как сохранить
на компьютер фото (с помощью библиотеки
aiogram)?

@dp.message_handler(content_types=['photo'])
async def handle_docs_photo(message):

    raw = await message.photo[0].download()
    b = BytesIO()
    b.write(raw.raw)
    with open('testfile.jpg', 'wb') as f:
        f.write(b.getvalue())

@dp.message_handler(content_types=['photo'])
async def handle_docs_photo(message):

    await message.photo[-1].download('test.jpg')


AttributeError: 'str' object has no attribute 'name'
Делал бота добавил разбан все работает кроме EMBED
Когда пишу .unban бот удаляет сообщения и unbanned человека но EMBED не выводит и напишет в консоль
 AttributeError: 'str' object has no attribute 'name'
<code>
async def unban(ctx, *, member):
    emb = discord.Embed(title = 'Unbanned', colour = discord.Color.green())
    await ctx.channel.purge(limit = 1)
    banned_users = await ctx.guild.bans()
    member_name, member_discriminator = member.split('#')

    for ban_entry in banned_users:
        user = ban_entry.user

        if(user.name, user.discriminator)==(member_name, member_discriminator):
            await ctx.guild.unban(user)
            emb.set_author(name = member.name, icon_url = member.avatar_url) #ОШИБКА С NAME
            await ctx.send(embed = emb)
            return
</code>

member - это строка. Откуда у строки поле
name? В проблемной строке должно быть либо
user.name, либо
member_name.


Подскажите, пожалуйста, почему не включается музыка?
У меня не включается музыка в чем проблема???
<code>
import tkinter as tk

from tkinter import *

from PIL import ImageTk, Image

import os

from playsound import playsound

from threading import Thread

root = Tk()

Image = Image.open("image_.jpg")

Image = ImageTk.PhotoImage(Image)

panel = Label(root, image = Image)

panel.pack()

T = tk.Text(root, height=1, width=32)

T.pack()

T.insert(tk.END,"Король и шут - Дурак и Молния...")

Thread(target=playsound, args=('"audio.mp3"',)).start()

root.mainloop()
</code>

Вы не запустили поток. Используйте этот код:
<code>
from tkinter import *
from PIL import ImageTk, Image
import os
from playsound import playsound
from threading import Thread

root = Tk()

Image = Image.open("image_.jpg")
Image = ImageTk.PhotoImage(Image)

panel = Label(root, image = Image)
panel.pack()

T = Text(root, height=1, width=32)
T.pack()
T.insert(END,"Король и шут - Дурак и Молния...")

th1 = Thread(target=lambda: playsound('audio.mp3'))
th1.start()

root.mainloop()
th1.join()
</code>


Подскажите, пожалуйста, как объединить картинку и музыку?
У меня проблема, я хочу объединить музыку, текст и картинку. Но у меня сначала играет музыка, а потом уже картинка с текстом. Как их объединить? Я знаю, что для музыки надо составить отдельный поток, но я не знаю как.
<code>
import tkinter as tk
from tkinter import *
from PIL import ImageTk, Image
import os
from playsound import playsound

root = Tk()

Image = Image.open("image_.jpg")
Image = ImageTk.PhotoImage(Image)

panel = Label(root, image = Image)
panel.pack()

T = tk.Text(root, height=1, width=32)
T.pack()
T.insert(tk.END,"Король и шут - Дурак и Молния...")

playsound("audio.mp3")

root.mainloop()
</code>

from threading import Thread

...

Thread(target=playsound, args=('"audio.mp3"',)).start()

root.mainloop()


Ошибка - "попытка прочитать закрытый файл"
Всем доброго времени суток. В данном коде присутствует работа с изображением в переменной
data идет создание даты для пост запроса, файлы можно только один раз читать я это понял, но я не понял, почему ошибка не ушла, когда я в коде создал еще 1 дату?

async def _upload_file_to_vk(self, upload_url, data):
    async with self.manager.session.post(upload_url, data=data) as resp:
        if resp.status != 200:
            return None

        upload_result_text = await resp.text()

        if not upload_result_text:
            return None

        try:
            upload_result = json.loads(upload_result_text)

            if "error" in upload_result:
                raise RuntimeError

        except RuntimeError:
            return None

        return upload_result
async def upload_photo(self, file, **kwargs):

    if kwargs.get("peer_id") is None:
        peer_id = self.peer_id

    else:
        peer_id = kwargs.get("peer_id")

    upload_data = await self.manager.request(
        "photos.getMessagesUploadServer", peer_id=peer_id
    )

    if upload_data.error:
        return None

    upload_url = upload_data.response["upload_url"]

    data = aiohttp.FormData()
    data.add_field("photo", file, filename="image.png")

    upload_result = await self._upload_file_to_vk(upload_url, data)

    if not upload_result:
        return None

    attachments = await self.manager.request(
        "photos.saveMessagesPhoto", **upload_result
    )

    #Если произошла ошибка пробуем загрузить тот же самый аттач без peer_id
    if attachments.error:
        upload_data = await self.manager.request(
        "photos.getMessagesUploadServer", peer_id=None
        )

        if upload_data.error:
            return None

        upload_url = upload_data.response["upload_url"]

        data = aiohttp.FormData()
        data.add_field("photo", file, filename="image.png")

        upload_result = await self._upload_file_to_vk(upload_url, data)

        if not upload_result:
            return None

        attachments = await self.manager.request(
            "photos.saveMessagesPhoto", **upload_result
        )

        if attachments.error:
            return None

    return self.manager.create_attachment(
        attachments.response[0], "photo"
    )

f = io.BytesIO()
img2.save(f, format='png')
f.seek(0)
at = await env.upload_photo(f)
f.close()

Получаю ошибку:

File "plugins/content/certificate.py", line 50, in certificate
at = await env.upload_photo(f)
File "/root/grizzly/kutana/manager/vk/environment.py", line 146, in upload_photo
upload_result = await self._upload_file_to_vk(upload_url, data)
File "/root/grizzly/kutana/manager/vk/environment.py", line 13, in _upload_file_to_vk
async with self.manager.session.post(upload_url, data=data) as resp:
File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 1005, in __aenter__
self._resp = await self._coro
File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 466, in _request
ssl=ssl, proxy_headers=proxy_headers, traces=traces)
File "/usr/local/lib/python3.6/dist-packages/aiohttp/client_reqrep.py", line 294, in __init__
self.update_body_from_data(data)
File "/usr/local/lib/python3.6/dist-packages/aiohttp/client_reqrep.py", line 479, in update_body_from_data
body = body()
File "/usr/local/lib/python3.6/dist-packages/aiohttp/formdata.py", line 148, in __call__
return self._gen_form_data()
File "/usr/local/lib/python3.6/dist-packages/aiohttp/formdata.py", line 142, in _gen_form_data
self._writer.append_payload(part)
File "/usr/local/lib/python3.6/dist-packages/aiohttp/multipart.py", line 798, in append_payload
size = payload.size
File "/usr/local/lib/python3.6/dist-packages/aiohttp/payload.py", line 360, in size
position = self._value.tell()
ValueError: I/O operation on closed file.

Не понимаю, что я делаю не так?

Вы не так поняли. Файлы можно читать неограниченное кол-во раз, но после каждого прочтения файла следует его закрывать, т.к. нередко Python начинает кричать неблагим матом и выводить кракозябры. Также возможно что вы не открыли нужный файл (самое первое обращение, например при работе с txt:
t = open('myfile.txt')), либо прописали неправильное название. Вполне возможно что он пытается обратиться к файлу в совершенно другой директории (отличной от расположения вашего файла), если найду пример правильного обращения к файлу, то вставлю сюда.

Вам надо прописать:

import os #В начале файла
data = aiohttp.FormData()
data.add_field("photo", file, filename=os.path.dirname(os.path.abspath(__file__))+"/имя_файла.расширение") #Таким образом файл будет искаться в одной директории с кодом.

Также вам нужно
f.close() использовать в другом месте, после вызова файла в двух местах внутри функции. Так вам не придётся закрывать файл вручную.


Проверка на возможность вычисления корня [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 3 года назад.

                        Улучшить вопрос

Необходимо проверить, можно ли вычислить корень из числа n. Если нет, то вызвать соответствующее сообщение.

Первый вариант с выведением корня из любого неотрицательного числа:

import math

while True:
    try:
        n = int(input('Введите число: '))
        n = math.sqrt(n)
        print(n)
        break
    except ValueError:
        print('ОШИБКА!!!!!!!!!!!! НЕЛЬЗЯ ВЫВЕСТИ КВАДРАТНЫЙ КОРЕНЬ ИЗ ОТРИЦАТЕЛЬНОГО ЧИСЛА!!!!!!! ПОВТОРИТЕ ВВОД!!!!')
        continue

Второй вариант с выведением только целого корня из неотрицательного числа:

import math

while True:
    try:
        n = int(input('Введите число: '))
        n = math.sqrt(n)
        if n % 1 == 0:
            print(n)
            break
        else:
            print('ОШИБКА!!!! ИЗ ЭТОГО ЧИСЛА НЕ ВЫВОДИТСЯ ЦЕЛЫЙ КОРЕНЬ!!! ПОВТОРИТЕ ВВОД!!!')
            continue
    except ValueError:
        print('ОШИБКА!!!! НЕЛЬЗЯ ВЫВЕСТИ КВАДРАТНЫЙ КОРЕНЬ ИЗ ОТРИЦАТЕЛЬНОГО ЧИСЛА!!! ПОВТОРИТЕ ВВОД!!!')
        continue


Парсинг с открытием информации
Нужно спарсить номера тел. отсюда.
В html, при открытие страницы, номера нет. После нажатия на кнопку "показать телефон", html обновляется уже с номером.
Нашел вариант решения в виде selenium, но получается очень долго(открывает сайт, клацает на кнопку).
<code>
driver = webdriver.Firefox()
driver.get(f'{url}')
driver.find_element_by_class_name('link-phone').click()
</code>
Думал достать html-код из ответа в Сеть->XHR->ответ. Как итог, не разобрался что к чему, ну и ответа не получил.
Правильно ли выбрал решение в виде selenium? Если да, то как ускорить процесс открытия.
Как попробовать достать телефон со страницы?(проблема в одинаковых тегах 'p')

Элементы следует определять заранее по их локаторам.

// CSS локатор элемента открывающего телефон
String activeFieldWithTextPhone = "a.link-phone";
// Xpath локатор поля содержащего номер телефона
Strign fieldWithPhoneNumber = "//*[@id='job-description']/p[last()]"

Следует использовать ожидание.По первому элементу надо просто нажать что не составляет труда. А из второго нужно получить текст и извлечь только числа, чтобы остался лишь номер телефона.
Выглядеть методы будут следующим образом

void waitForCssElementAndClick(String element) {
       WebDriverWait wait = new WebDriverWait(Driver, 10); // Wait for 10 seconds.
       wait.until(ExpectedConditions.visibilityOfElementLocated(By.css(element)));
       driver.findElement(By.сss(element)).click();
    }

String waitForXpathElementAndGetNumbers(String element) {
           WebDriverWait wait = new WebDriverWait(Driver, 10); // Wait for 10 seconds.
           wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));
           return driver.findElement(By.xpath(element)).text().replaceAll("[^0123456789]", "");
        }

Осталось только использовать

waitForCssElementAndClick(activeFieldWithTextPhone);
String phone = waitForXpathElementAndGetNumbers(fieldWithPhoneNumber);

Пример приведён на языке Java, но я думаю вам не составит труда преобразовать его в Python. Удачи.


Как ввести в одной строке n переменных
python как ввести в одной строке n переменных ( n вводится ранее )
<code>
n = int( input() )
</code>
а далее нужно в строке ввести n переменных.

Вы можете ввести любое количество переменных в массив:

>>> arr = input().split()
1 2 3 4 5
>>> arr
['1', '2', '3', '4', '5']

Заметьте, что это массив строк. Если нужно ввести массив целых чисел, то используйте следующую конструкцию:

arr = list(map(int, input().split()))


Читать последнюю строку из файла и выводить её, при этом НЕ выводить если строка не обновилась. Python
Есть файл .log в который изредка заносится новая строка. Задача в том, чтобы выводить в консоль строку, только что добавленную в файл.
Т.е должен быть цикл который считывает последнюю строку из файла и сравнивает её с прошлой, если она совпадает, то не выводить ничего, если же отличается, вывести в консоль новую строку. Надеюсь описал задачу понятно.

Накидал простой код. Конечно, он неэффективный, но пока что ничего лучше предложить не могу.
<code>
import os
import time

FILE_PATH = 'Путь к файлу'
old_file_size = 0
lines_in_file = 0
last_line = ''

def file_changed():
    global old_file_size

    new_file_size = os.path.getsize(FILE_PATH)

    if new_file_size != old_file_size:
        old_file_size = new_file_size
        return True
    return False

if __name__ == "__main__":
    while True:
        if file_changed():
            lines = []

            with open(FILE_PATH, 'r') as f:
                lines = f.readlines()

            for line in lines[lines_in_file:]:
                print('Добавлена новая строка: ', line, end='')

            lines_in_file = len(lines)

            print('\n--------------------------------')

        time.sleep(1)
</code>


Максимальное число среди нескольких списков [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 3 года назад.

                        Улучшить вопрос

Есть список:
<code>
spisok = [[1001,100,0,0],[1312,101,0,0],[1111,200,0,0]]
</code>
Как сделать так, чтобы взялось максимальное число с индексом 1 среди списков
и вывелось число с индексом 0 у списка, в котором находится максимальное число?

Проще и эффективнее всего воспользоваться встроенной функцией max(iterable, key):

records = [[1001,100,0,0],[1312,101,0,0],[1111,200,0,0]]
res = max(records, key=lambda x: x[1])[0]

print(res)
> 1111

пошагово:

In [49]: max(records, key=lambda x: x[1])
Out[49]: [1111, 200, 0, 0]

In [50]: max(records, key=lambda x: x[1])[0]
Out[50]: 1111


Дружественные числа.Как оптимизация перебор?(Python) [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 3 года назад.

                        Улучшить вопрос

<code>
def sumNumDivs(num):
divs_sum = -num
div = 1
while div * div <= num:
    if num % div == 0:
        if div == num // div:
            divs_sum += div
        else:
            divs_sum += div
            divs_sum += num // div
    div += 1
return divs_sum

first, last = map(int, input().split())
c = 0
for z in range(first, last + 1):
    for k in range(z+1, last + 1):
        if sumNumDivs(z) == k and sumNumDivs(k) == z:
            print("(", z, ',', k, ")", sep='', end=' ')
            c += 1
if c < 1:
    print(0)
</code>
Как сократить время работы?Я так понимаю проблема в переборе и сравнении.

Если Вы добавите счетчик к вызовам функции sumNumDivs, то увидите, что она вызывается очень много раз для тех же самых чисел. А это явный признак сделать "мемоизацию". Есть много техник, но в данном случае хорошо так, после функции sumNumDivs добавляем такое:
<code>
def memoize(f):
    memo = {}
    def helper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]
    return helper

sumNumDivs = memoize(sumNumDivs)
</code>
запускаем и наслаждаемся.
По факту, можно вначале просто пройтись по числам и сделать массив кол-ва делителей. А потом уже по нему смотреть. Это может оказаться сильно быстрее.


Ошибка ValueError: The truth value of an array with more than one element is ambiguous.Use a.any() or a.all()
<code>
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

dt = DecisionTreeClassifier()

dt = dt.fit(X_train, y_train)

predicted = dt.predict(X_test, y_test)
</code>
В чем проблема? Модель обучается на таких же данных, но ничего не предсказывает. Вылазит ошибка

ValueError: The truth value of an array with more than one element is ambiguous.Use a.any() or a.all()

Сохранял данные в DataFrame, но все так же ошибка.

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Метод
dt.predict(X, check_input=True) ожидает два аргумента - матрицу значений, на основании которой будут делаться предсказания и булевый флаг
check_input. Вы передали в качестве второго параметра массив правильных значений вместо скалярного значения. В коде
dt.predict есть проверка
if check_input: - на этой строке кода выпадет исключительная ситуация, т.к. конструкция
if np.array([1, 0, 0, 2]) - не может быть однозначно проверена.
Нет смысла передавать в
dt.predict() заранее известный ответ -
y_test.
Правильно делать так:

predicted = dt.predict(X_test)

Если вы хотите проверить точность предсказаний то можно воспользоваться методом
.score():

In [5]: dt.score(X_test, y_test)
Out[5]: 0.9473684210526315


Функция не видит виджеты внутри класса
Прощу помощи. По какой такой неведомой мне причине, вот таким образом внутри класса можно обратиться к 'w1'

class Starter:

    A = 40
    B = 100
    C = 70

    win = Tk()
    win.title='Press'
    win.geometry("300x300")

    lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
    bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')

    w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)

    w1.get()

    canv = Canvas(win,width = 200,height = 200,bg = 'blue')
    canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
    canv.pack()
    w1.pack()

А вот так нельзя.

class Starter:

    A = 40
    B = 100
    C = 70

    def ab_t(event):
        w1.get()

    win = Tk()
    win.title='Press'
    win.geometry("300x300")

    lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
    bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')

    w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)

    bt.bind("<Button-1>", ab_t)

    canv = Canvas(win,width = 200,height = 200,bg = 'blue')
    canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
    canv.pack()
    w1.pack()

Вы неправильно "готовите" классы. Код должен быть в методах класса, а не на верхнем уровне классов. На верхнем уровне должны только прописываться поля, общие для всех объектов данного класса.
То что вы сейчас делаете можно делать через обычные функции:

from tkinter import *

def Starter():
    A = 40
    B = 100
    C = 70

    def ab_t(event):
        python(w1.get())

    win = Tk()
    win.title='Press'
    win.geometry("300x300")

    # lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
    # bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
    bt = Button(win)

    w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)

    bt.bind("<Button-1>", ab_t)

    canv = Canvas(win,width = 200,height = 200,bg = 'blue')
    canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
    canv.pack()
    w1.pack()

    win.mainloop()

Starter()

То же самое через условно "правильный" класс:

from tkinter import *

class Starter:
    def __init__(self):
        A = 40
        B = 100
        C = 70

        def ab_t(event):
            print(w1.get())

        win = Tk()
        win.title='Press'
        win.geometry("300x300")

        # lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
        # bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
        bt = Button(win)

        w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)

        bt.bind("<Button-1>", ab_t)

        canv = Canvas(win,width = 200,height = 200,bg = 'blue')
        canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
        canv.pack()
        w1.pack()

        win.mainloop()

Starter()

Или если нужно чтобы
ab_t было отдельным методом, а не вложенной функцией:

from tkinter import *

class Starter:
    def ab_t(self, event):
        python(self.w1.get())

    def __init__(self):
        A = 40
        B = 100
        C = 70

        win = Tk()
        win.title='Press'
        win.geometry("300x300")

        # lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
        # bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
        bt = Button(win)

        self.w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)

        bt.bind("<Button-1>", self.ab_t)

        canv = Canvas(win,width = 200,height = 200,bg = 'blue')
        canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
        canv.pack()
        self.w1.pack()

        win.mainloop()

Starter()


Первый код ,первая проблема
Решил сделать что-то вроде текстовой игры,просто для себя, чтобы как-то разобраться в Питоне. Как сделать оставшуюся прочность переменной? Чтобы следующий выстрел вычитался не из hp2=450, а из оставшийся прочности?
<code>
import random

N1 = "PzKpfw V Panther"
a = random.randint(0, 100)
b = random.randint(80, 120)
c = random.randint(75,105)
r = random.randint(0, 100)
br1=90
hp = 450
N2 = "т34-85"
d = random.randint(0,100)
e = random.randint(80,110)
f = random.randint(80,105)
br2=90
hp2= 450
if a<65:
    print ("PzKpfw V Panther делает выстрел")
    print ("Попадание")
if r<11:
    print ("Рикошет")
if b>br2 & r>11:
    print ("Броня "+str(N2)+" пробита!")
if b>br2 & r>11:
    print ("Нанесено " + str(c) + " урона")
if b<br2:
    print ("Броня непробита")
if b>90 & r>11:
    print  ( "У " +str(N2)+" Осталось " "%.2f" % (hp2-c)+ " прочности")
</code>

Вместо последних 2 комманд

if b>90 & r>11:
    print  ( "У " +str(N2)+" Осталось " "%.2f" % (hp2-c)+ " прочности")

используйте

if b>90 & r>11:
    hp2 = hp2 - c        # прежде всего обновить hp2; возможна короткая форма:  hp2 -= c
    print( "У " +str(N2)+" Осталось " "%.2f" % hp2+ " прочности")    # hp2 вместо (hp2-c)

Примечание:
Вы используете старый стиль форматирования —  очень некрасиво для чтения.
Когда у вас Питон 3.6 или выше, примените форматирующую строку (буква
f непосредственно перед открывающей кавычкой):

print(f"У {N2} осталось {hp2:.2f} прочности")

(в фигурных скобках — прямо имена переменных или выражения, формат за двоеточием, когда он нужен,
str() совсем не надо).
Для низшей версия Питона, исключите
f, вместо того добавите
.format() и переменные перенесите в скобки — так:

print("У {} осталось {:.2f} прочности".format(N2, hp2))

(это будет работать вне зависимости от версии Питона — но не в очень, очень старых).
То же самое возможно сделать и в ваших других применениях функции
print().


finding a character in a string [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос закрыт, так как на Stack Overflow на русском вопросы принято задавать только на русском языке. Пожалуйста, переведите ваш вопрос на русский язык или воспользуйтесь Stack Overflow на английском.

Закрыт 3 года назад.

                        Улучшить вопрос

Используйте цикл
for для прохождения строки, и подсчитайте число символов
l в строке
Hello world.

Это моя программа на Питоне и она не работает. Прошу вас показать мне правильный подход и почему мой код не работает:

str = 'Hello world'
k = 0
for i in str:
    if str[b] == 'l':
      k += 1

print(k)

    if str[b] == 'l':

В вашей программе нет переменной
b, потому ошибка.
Используйте прямо переменную
i из заголовка цикла

for i in str:
    if i == 'l':

так как ее значением является очередной символ из переменной
str.

Примечание 1:
Есть тоже такая возможность поправки:

for b in range(len(str)):
    if str[b] == 'l':

но это некрасивый, не Питонический подход.
Примечание 2:

str не очень удобное имя для переменной, потому что оно есть имением встроенной функции. Было бы хорошо применить какое-то другое, по меньшей мере
str_.


Проблема с кодировкой при парсинге сообщения твич
Есть переменная message в нее парсится сообщение и получается, что то по типу \xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82
И как это можно перевести в нормальную строку?
ps: нужно чтобы именно переменная message потом станвоилась нормальной строкой с правильной кодировкой (сообщение берется с чата твича, если это как то делу поможет)

Если это имеет тип bites то можно просто применить метод decode

b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'.decode('utf-8')

эта строка даст
"привет".
Если у вас строка с escape-последовательностью, т.е.:

 b = '\\xd0\\xbf\\xd1\\x80\\xd0\\xb8\\xd0\\xb2\\xd0\\xb5\\xd1\\x82'

то можно такой способ применить:

b.encode('latin1').decode('unicode-escape').encode('latin1').decode('utf-8')

вызовы encode нужны потому что они возвращают байты, у которых есть методы decode
Ну и последний случай, если у вас вдруг так задана переменная:

a = '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

То декодировать её можно так:

a.encode('latin1').decode('utf-8')


Python Kivy на других платформах [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 3 года назад.

                        Улучшить вопрос

Вопрос таков, как написанный код на python kivy запускать на разных платформах?
Или я что-то не так понял?

Точно так же, как и код на Python:

Для Android/iOS есть Buildozer.
Чисто для iOS есть Kivy for iOS.


Как правильно использовать multiprocessing для при работе с данными?
Возникла у меня проблема. Есть большие мощности, но по умолчанию, только для обучения нейронных сетей, мы используем все ядра.
У меня есть функции связанные с препроцессингом данных и другие функции, которые я бы хотел разделить между всеми ядрами, для более быстрого их выполнения и потом соединить результат в одном массиве.
Вот моя функция
Вот как я это делаю сейчас:

tresh_list = []
for i in range (1,41):
# def multiproc_func(X, y):
    print('----------------------------------------')
    print('ITERATION: {}'.format(i))
    (X_train_t, y_train_t, X_train_v, y_train_v, X_test, y_test) = data_split(X, y)
    model = model_create(X)
    print('-----------------------------------------')
    print('Train the model')
    model.fit(X_train_t, y_train_t, batch_size=1024, epochs=5, validation_data = (X_train_v, y_train_v))
    print('Training finished')
    print('-----------------------------------------')
    print('Metrics for train set, treshold=0.5')
    print('-----------------------------------------')
    t_pred_t, pred_t = predict(X_train_t, y_train_t)
    print('-----------------------------------------')
    print('Metrics for validation set, treshold=0.5')
    print('-----------------------------------------')
    y_pred_v, pred_v = predict(X_train_v, y_train_v)
    print('-----------------------------------------')
    print('Metrics for test set without, treshold=0.5')
    print('-----------------------------------------')
    y_pred_test, pred_test = predict(X_test, y_test)
    print('-----------------------------------------')
    print('Started threshold-precision distribution. It can get some time...')
    (prec_train, _) = tresh_prec_distribution(y_train_t, pred_t)
    (prec_valid, _) = tresh_prec_distribution(y_train_v, pred_v)
    print('Treshold-precision distrubution finished')
    prec_valid_train = [x + y for x, y in zip(prec_train, prec_valid)]
    prec_id = argmax(prec_valid_train)
    # Drop boundary values
    prec_valid_train.pop(prec_id)
    prec_id = argmax(prec_valid_train)
    prec_valid_train.pop(prec_id)
    best_prec = max(prec_valid_train)
    y_pred = []
    for i in pred_test:
        if i[0] >= treshold[prec_id]:
            y_pred.append(0)
        else:
            y_pred.append(1)
    print('The best treshold: {}'.format(treshold[prec_id]))
    print('Precision score: {}'.format(precision_score(y_test, y_pred)))
    print('Recall score: {}'.format(recall_score(y_test, y_pred)))
    tresh_list.append(treshold[prec_id])

Логика такая: на каждой итерации я определяю нужное мне значение и потом его добавляю в список
tresh_list. Но, как я говорил все операции выполняются только на одном ядре, по этому процесс занимает часы.
Как решить эту задачу с использованием мультипроцессинга?
Т. е. мне надо снача распарралелить процессы, получить значение
treshold[prec_id] для каждого из процесса, и собрать все значения
treshold[prec_id] в одном списке
tresh_list
Я уже читал документацию и смотрел примеры, но не могу понять как их применить в текущей ситуации.
Спасибо

Вы можете использовать этот код для распараллеливания:
<code>
from threading import Thread
tresh_list = []
def multiproc_func(X, y):
    global tresh_list
    # Ваш код

todo=[]
for i in range(1,41): # создаем список процессов
    todo.append( Thread(target= multiproc_func, args=(X, y)) )
for th in todo: # стартуем каждый процесс
    th.start()
for th in todo: # запускаем каждый процесс
    th.join()
</code>


решение найдено:
Добавил проверку на None по совету insolor (В чем отличие двух функций?).
Дополнительно добавил проверку
res != result. Без этой проверки в финальный список
result добавлялся элемент с бесконечным список элементов.

def get_pair(pri_dict, list_param_val, list_param, result = None):

    if result is None:
        result = []

    if isinstance(pri_dict, dict):
        for key_prim, val_prim in pri_dict.items():
            if isinstance(val_prim, dict):
                key_prim_param_val = list_param_val.get(key_prim)
                key_prim_param = list_param.get(key_prim)
                if key_prim_param_val is None or key_prim_param is None:
                    print "ALARM"
                    continue
                res = get_pair(val_prim, key_prim_param_val, key_prim_param, result)
                if res != result:
                    result.append(res)
            else:
                spisok =[]
                key_prim_param_val = list_param_val.get(key_prim)
                key_prim_param = list_param.get(key_prim)
                spisok.append(key_prim)
                spisok.append(val_prim)
                spisok.append(key_prim_param_val)
                spisok.append(key_prim_param)
                print "spisok = {}".format(spisok)

                return spisok
    else:
        print ("STOP")
    print "result = {}".format(result)
    return result


Python, подсчет контрольной суммы CRC16, библиотека crcmod
Задача посчитать контрольную сумму CRC16-modbus. Использую библиотеку crcmod.
На входе строка str_b

import crcmod
str_b='010620010C4E'
str_b=str_b.encode('utf-8')
crc16 = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True,  xorOut=0x0000)
crc16=crc16(str_b)
crc16=hex(crc16)
print(crc16)

на выходе значение контрольной суммы 0xfd43, которое не совпадает с действительным 0xfe56. Если я представляю строку в виде

str_x='\x01\x06\x20\x01\x0C\x4E'

то контрольная сумма считается правильно. Как мне преобразовать строку str_b к виду str_x? А может я вообще на не правильном пути? Прошу помощи.

Александр, строка
'010620010C4E' - это последовательность символов, а не байтов.
Вам нужно преобразовать её в массив байтов:
str_b = bytes.fromhex('010620010C4E')

import crcmod

str_b = bytes.fromhex('010620010C4E')
crc16 = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True,  xorOut=0x0000)
crc_int=crc16(str_b)
crc_str=hex(crc_int)
print(crc_str)

Результат:
0xfe56


Как реализовать задачу?
Нужно чтобы бралось случайное число от 0 до 100, и если оно больше чем предыдущее
( такое же от 0 до 100 ) оно выводилось зелёным, если наоборот - красным.
Примерный код:
<code>
import random
from colorama import Fore
from time import sleep

while True:

    a = random.randint(0,100)

    sleep(0.5)

    if a > a:
        print(Fore.GREEN + str(a))
    elif a < a:
        print(Fore.RED + str(a))
</code>
Заранее спасибо

import random
from colorama import Fore
from time import sleep

colors = [Fore.RED, Fore.GREEN]

first = random.randint(0, 100)
while True:
    second = random.randint(0, 100)
    print(colors[second > first] + str(second))

    first = second
    sleep(0.5)


Как выполнить арифметическое выражение с высокой точностью?
Как заставить питон посчитать выражение, например

(1/3-0.3333333333333333)*10**16

Нужно повысить точность расчета, но я не знаю, как это сделать. Знаю, что можно сделать через Decimal, но тогда каждое числовое значение нужно будет записать как
Decimal('1') и т.д.
А можно ли задать точность более "красиво" типа
a = Decimal('необходимые вычисления')?

Можете воспользоваться модулем sympy.

from sympy import *
result = N("(1/3-0.3333333333333333)*10**16")

В результате получится значение

0.333333333333333

Вторым аргументом можно задать точность вычислений.

print(N("(1/3-0.3333333333333333)*10**16", 50))
# 0.33333333333333333333333333333333333333333333333333

Результат будет иметь тип
sympy.core.numbers.Float. Его можно выводить на экран, использовать в других выражениях как с методами sympy, так и в обычной арифметике. Получить стандартный
float можно, применив функцию
float().


Как с помощью модуля os получить название диска, в котором находится текущий каталог?
Пожалуйста, подскажите, есть ли оптимальный способ извлечения названия диска, в котором находится текущий каталог? Или легче обрезать путь к текущему каталогу после первого слэша?

import os
a =os.getcwd()
b =a[0]+a[1]+a[2]


Получить все файловые дескрипторы открытых файлов
При исполнении кода на gpu возникает проблема:
<code>
48it [00:07,  8.79it/s]Traceback (most recent call last):
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/queues.py", line 236, in _feed
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/reduction.py", line 51, in dumps
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/multiprocessing/reductions.py", line 337, in reduce_storage
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/reduction.py", line 194, in DupFd
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/resource_sharer.py", line 48, in __init__
OSError: [Errno 24] Too many open files
50it [00:07,  9.96it/s]Traceback (most recent call last):
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/resource_sharer.py", line 149, in _serve
Traceback (most recent call last):
  File "my_siamese.py", line 182, in <module>
    send(conn, destination_pid)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/resource_sharer.py", line 50, in send
    for idx, data in tqdm.tqdm(enumerate(train_dataloader, 0)):
    reduction.send_handle(conn, new_fd, pid)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/reduction.py", line 179, in send_handle
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/tqdm/std.py", line 1107, in __iter__
    with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/socket.py", line 463, in fromfd
    for obj in iterable:
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 345, in __next__
    data = self._next_data()
    nfd = dup(fd)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 841, in _next_data
OSError: [Errno 24] Too many open files
    idx, data = self._get_data()
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 808, in _get_data
    success, data = self._try_get_data()
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 761, in _try_get_data
    data = self._data_queue.get(timeout=timeout)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/queues.py", line 113, in get
    return _ForkingPickler.loads(res)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/site-packages/torch/multiprocessing/reductions.py", line 294, in rebuild_storage_fd
    fd = df.detach()
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/resource_sharer.py", line 58, in detach
    return reduction.recv_handle(conn)
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/reduction.py", line 185, in recv_handle
    return recvfds(s, 1)[0]
  File "/home/eurvanov/anaconda3/envs/seamease/lib/python3.7/multiprocessing/reduction.py", line 155, in recvfds
    raise EOFError
EOFError
50it [00:07,  6.52it/s]
</code>
Исходя из лога, видно, что

OSError: [Errno 24] Too many open files

Хочу на каждом шаге мониторить, какие файлы открыты. Можно ли это как-нибудь сделать?

Поскольку это linux, можно использовать команду
lsof -p pid.  С помощью
sysctl fs.file-max это ограничение можно менять, конечно, если это не ошибка в приложении.


Python регулярные выражения findAll
Как в findall передать несколько символов? Мне нужно найти количество символов ('\n', '.', ',', 'Пробел') в тексте(Текст в файле air.txt). Но таким образом я могу передать только 1-ин символ. Подскажите пожалуйста, куда копать?)
<code>
import re

common = ('\n')

with open('air.txt', 'r') as file:
    readfile = file.read()
    result = re.findall(common, readfile)
    print('Количество пробелов в файле: ', len(result))

file.close()
</code>

Надо использовать регулярные выражения, а не просто передавать символ для поиска

import re

common = r'[\s]|["."]|[","]'

with open('air.txt', 'r') as file:
    readfile = file.read()
    result = re.findall(common, readfile)
    print('Количество пробелов в файле: ', len(result))

file.close()

[\s]|["."]|[","] - точка и запятые понятно, а
\s проверяет вхождение любого
whitespace символа.

| - аналог или


Объединение двух гомогенных DataFrame
Пытаюсь решить такую задачу:

отобрать из исходного DataFrame некоторый набор строк,
присвоить в определенном столбце в выборке новое значение
объединить обратно исходный DataFrame и обработанную
    выборку по совпадению индексов таким образом, чтобы в результате в
    исходном DataFrame сохранились изменения столбца, сделанные на шаге
    2.

Споткнулся на шаге #3 - объединение.
Тестовый набор данных, обработанный в DataFrame:

test = {'UID' : ('00000639616', '00000675306', '00000675305','00000639617', '00000675301', '00000675302'),
          'ID': ('02ab9161', '02ab9162', '02ab9163','02ab9164', '02ab9165', '02ab9166 '),
        'АНДС': (True, True, True, False, True, False),
        'Дата': ('2019-01-01', '2020-01-01', '2021-01-01','2019-01-01', '2020-01-01', '2021-01-01'),
    'Бизнес-Линия': ('Сегмент1', 'Сегмент1', 'Сегмент1', 'Сегмент1', 'Сегмент1','Сегмент1')}
df_test = pd.DataFrame(test)
df_test.set_index(['IDКлиента', 'Агрессивный НДС', 'Дата инвестиции'], inplace=True)
df.sort_index(ascending=True, inplace=True)

Выглядит DataFrame так:

                                                Расчет Бизнес-Линия
IDКлиента Агрессивный НДС Дата инвестиции
02ab9161  True            2019-01-01       00000639617     Сегмент1
02ab9162  True            2020-01-01       00000675306     Сегмент1
02ab9163  True            2021-01-01       00000675306     Сегмент1
02ab9164  False           2019-01-01       00000639617     Сегмент1
02ab9165  True            2020-01-01       00000675306     Сегмент1
02ab9166  False           2021-01-01       00000675306     Сегмент1

Шаги #1 и #2:

df_test1 = df_test.sample(2)
df_test1.loc[:, 'Бизнес-Линия'] = 'Сегмент 2'

Дают результат:

                                                Расчет Бизнес-Линия
IDКлиента Агрессивный НДС Дата инвестиции
02ab9165  True            2020-01-01       00000675306    Сегмент 2
02ab9162  True            2020-01-01       00000675306    Сегмент 2

На шаге #3 хочу получить новый DataFrame:

                                                Расчет Бизнес-Линия
IDКлиента Агрессивный НДС Дата инвестиции
02ab9161  True            2019-01-01       00000639617     Сегмент1
02ab9162  True            2020-01-01       00000675306     Сегмент 2
02ab9163  True            2021-01-01       00000675306     Сегмент1
02ab9164  False           2019-01-01       00000639617     Сегмент1
02ab9165  True            2020-01-01       00000675306     Сегмент 2
02ab9166  False           2021-01-01       00000675306     Сегмент1