Страницы

Поиск по вопросам

Показаны сообщения с ярлыком python-2.x. Показать все сообщения
Показаны сообщения с ярлыком python-2.x. Показать все сообщения

понедельник, 30 марта 2020 г.

Составить программу расчета функции, по минимуму использовать встроенные методы и функции

#python #python_3x #python_2x #python_35


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



Вот, что пока получилось:

def NonRec(x, eps):
    s=1
    term=1
    i=0
    while (abs(term) > eps):
        term=term*(x/(i+1))
        s+=term
        i+=1
    return s 

    


Ответы

Ответ 1



Нерекурсивная функция: import math def cosine(x, eps=1e-5): res = 1 i = 1 x = x * math.pi / 180. while True: delta = (x**(2*i) / math.factorial(2*i)) res += (-1)**i * delta i += 1 if delta <= eps: return res, i Пример: In [50]: res, n = cosine(123, eps=1e-6) In [51]: print(res, n) -0.544639044595552 8

пятница, 20 марта 2020 г.

Функция для ввода строк в Python

#python #python_2x


Пробовал использовать input, но она выводит ошибку при вводе строки. Как можно в
консоле вводить строки? Python 2.7.
    


Ответы

Ответ 1



raw_input()

Ответ 2



>>> import sys >>> sys.stdin.readline() asdawda 'asdawda\n'

Ответ 3



>>> x=input("введите число:") введите число:1 >>> print x 1 >>> python 2.7 ни каких проблем

Ответ 4



#по-моему так s = str(input())

воскресенье, 15 марта 2020 г.

Вывод древовидной структуры в шаблоне jinja2

#python #django #python_2x #jinja2


Имеется список словарей вида:

[
 {'comment_id': 9, 'level': 1, 'path': [9]},
     {'comment_id': 11, 'level': 2, 'path': [9, 11]},
 {'comment_id': 12, 'level': 1, 'path': [12]},
     {'comment_id': 13, 'level': 2, 'path': [12, 13]},
     {'comment_id': 14, 'level': 2, 'path': [12, 14]},
         {'comment_id': 15, 'level': 3, 'path': [12, 14, 15]},
             {'comment_id': 16, 'level': 4, 'path': [12, 14, 15, 16]}
]


comment_id - уникальный идентификатор комментария, level - уровень вложенности, path
- список-путь к родителю, где каждый элемент является идентификатором comment_id.

Вывод на стринце должен быть такой:

comment9
    comment11
comment12
    comment13
    comment14
        comment15
            comment16


Возможно ли повторить подобную вложенность в шаблоне jinja2 располагая имеющимися
данными?
    


Ответы

Ответ 1



Пример из документации http://jinja.pocoo.org/docs/dev/templates/
    {%- for item in sitemap recursive %}
  • {{ item.title }} {%- if item.children -%} {%- endif %}
  • {%- endfor %}


понедельник, 9 марта 2020 г.

Способы мультиязычности программ на Python?

#python #python_2x #локализация


При разработке приложения с поддержкой нескольких языковых локализаций, я использую
файл, в котором храню все строковые данные программы. Раньше я обходился простым -

exec(open("файл/языковой/локолизации").read())


инициализируя таким образом все переменные со строковыми значениями в основной код
приложения.

Сейчас exec как-то не хочется использовать. Я приспособил для этих целей модуль ConfigParser.
Сейчас это выглядит вот так:

from ConfigParser import ConfigParser


config = ConfigParser()
config.read("locale.ini")
language = config.get("LOCALE", "language")  # устанавливаем локаль
section = language.upper()
config.read("{}.ini".format(language))  # читаем файл строковых данных

# Таким образом я получаю строковые значения для приложеничя.
program_title = config.get(section, "program_title")


locale.ini
(файл текущей локализации приложения):

[LOCALE]
language = english


english.ini
(файл со строковыми данными):

[ENGLISH]
program_title = Clean Master


Теперь, скажем, если мне нужно сменить язык на русский, я добавляю файл russian.ini
со строками русской локализации, а в файле locale.ini устанавливаю значение "language"
в "russian".

Получается следующее:

locale.ini 
(файл текущей локализации приложения):

[LOCALE]
language = russian


english.ini 
(файл со строковыми данными):

[RUSSIAN]
program_title = Мастер Очистки


Может быть в Python есть другие варианты вышеописанного велосипеда?
    


Ответы

Ответ 1



Вообще, есть довольно стандартный вариант - использовать библиотеку gettext, для которой есть биндинги в том числе и для Python (причем, в стандартной библиотеке, не исключено, что это реализация gettext на Python). Принцип работы примерно такой: все строки, подлежащие переводу оборачиваются в вызов специальной функции _(). Далее, программа обрабатывается утилитой pygettext, вытаскивающей все переводимые строки, в результате получается файл .pot (шаблон перевода), в который в дальнейшем можно добавить перевод. Это текстовый файл с относительно простой внутренней структурой, его можно редактировать чем-то блокнотоподобным, но есть и специализированные утилиты, например, poedit, также его можно загрузить на какой-нибудь из сервисов онлайн-перевода типа crowdin.com или transifex.com, и редактировать там совместно с другими переводчиками. Из файла .pot получается файл .po (по сути тот же .pot, но с заполненным переводом строк на нужный язык), который потом компилируется в файл .mo (бинарный файл, хотя тоже с довольно простой внутренней структурой) с помощью утилиты msgfmt из пакета gettext или утилиты msgfmt.py из пакета Python. Далее, перевод импортируется в переводимую программу при помощи команды gettext.install('mary', './locale', unicode=True) (пример отсюда, реальные параметры могут быть другими). Парочка нагугленных руководств: Международные ягнята / Хабрахабр Локализация Python-скриптов при помощи gettext Если потребуется редактировать перевод онлайн совместно с другими переводчиками, могу сказать, что упомянутые выше crowdin и transifex бесплатны для Opensource продуктов, но в crowdin с этим довольно строго, в то время как в transifex достаточно того, чтобы перевод был доступен публично, и в настройках проекта была ссылка на исходный код. При этом субъективно у crowdin более дружелюбный интерфейс.

пятница, 14 февраля 2020 г.

Python 2.7 сравнение списка с числом

#python #python_2x


a=[1, 2, 3, 4, 5]
a > 10000000 #True
a < 29 #False


При сравнении списка с числом получается что список больше любого числа. Почему вообще
определена операция сравнения списка с числом (в Python 3.6 такая операция не определена)
и что происходит при этом сравнении?
    


Ответы

Ответ 1



Во второй версии Питона можно сравнивать объекты разных (нечисловых) типов. В этом случае сравнение происходит по имени типа. Примеры: print [1] > 1 # 'list' > 'int' - True print [1] > '1' # 'list' > 'str' - False Сравнения разных числовых типов происходит по обычным математическим правилам. Note that comparing objects of different types is legal. The outcome is deterministic but arbitrary: the types are ordered by their name. Thus, a list is always smaller than a string, a string is always smaller than a tuple, etc. [1] Mixed numeric types are compared according to their numeric value, so 0 equals 0.0, etc https://docs.python.org/2.7/tutorial/datastructures.html#comparing-sequences-and-other-types - последний абзац

четверг, 13 февраля 2020 г.

Можно ли хранить “путь” в списках и словарях в переменной?

#python #python_2x


Большой JSON читается в переменную:

json_response = json.loads(request.text)


Есть пачка методов, которые делают различные проверки различных элементов этого JSON'а

def testfoo(self, json_response):
    assertEquals(json_response['element']['some array'][0]['message'], 'foo')


def testbar(self, json_response):
    assertEquals(json_response['other element']['fizz']['buzz'], 'bar')


Вопрос: а можно ли "путь" внутри объекта хранить в переменной и передавать в метод
как аргумент? Что-то вроде этого:

def assertByPath(self, json_response, path, expected):
    assertEquals(path.get(json_response), expected)

def testfoo(self, json_response):
    foopath = path(['element']['some array'][0]['message'])
    assertByPath(json_response, path, 'foo')

def testbar(self, json_response):
    barpath = path(['other element']['fizz']['buzz'])
    assertByPath(json_response, path, 'bar')


Что-то похожее предоставляет CSS Selector.

UPD: есть даже аналогичный JSONSelect. А как насчет решения, которое работает не
только для json, а для любого сочетания вложенных списков и словарей?
    


Ответы

Ответ 1



Можно "путь" просто как список передавать: import operator def get_by_path(obj, *path): return reduce(operator.getitem, path, obj) Пример: >>> get_by_path(response, 'element', 'some array', 0, 'message') 'foo' Достоинство: позволяет в качестве ключей произвольные типы использовать. Легко другой синтаксис поддерживать, если необходимо. Например, чтобы не плодить сущности без необходимости, можно использовать подмножество языка, используемого jq утилитой (если ограничиться json типами).

Ответ 2



Ну, всегда можно навелосипедеть что-то свое: d = { "1": {2, 3}, "2": { "3": "foo" }, "3": { "3.1": { "foo": "bar" } } } def value_from_path(d, path): parts = path.split('/') value = d while parts: part = parts.pop(0) value = value[part] return value print(d['2']['3']) print(value_from_path(d, '2/3')) print(value_from_path(d, '3/3.1')) print(value_from_path(d, '3/3.1/foo')) print(value_from_path(d, '3')) Консоль: foo foo {'foo': 'bar'} bar {'3.1': {'foo': 'bar'}}

воскресенье, 9 февраля 2020 г.

zipfile не распаковывает архив

#python #python_2x #zip #ziparchive


# -*- coding: utf-8 -*-
import zipfile
root = "C:"
z = zipfile.ZipFile(root + '\\ProgramData\\boot//s0urc3.zip','r')
z.extractall()


Все выполняется без ошибок, но архив не распаковывается, почему?
    


Ответы

Ответ 1



Файлы распаковываются в текущую рабочую папку. Добавьте в начало скрипта: import os print os.getcwd() Это покажет вам рабочую папку (обычно это папка, где лежит запускаемый скрипт) и там будут распакованные файлы А в конец скрипта добавьте z.close() Чтобы указать папку, куда нужно сохранить, нужно передать ее в качестве параметра: path_to_extract = 'C:\\Data' z.extractall(path_to_extract) Если в этой папке окажутся файлы с именами, совпадающими с файлами в архиве, они будут перезаписаны без предупреждения.

суббота, 8 февраля 2020 г.

Передача данных между python и node.js

#python #nodejs #python_2x


Здравствуй, есть скрипт на Python, который получает данные от датчиков и управляет
моторами (это не важно) и node.js ,который работает с клиентом через socket.io.  

Как можно передать данные из python скрипта в js скрипт и наоборот?  

Пробовал запускать python из под node.js, через библиотеку python-shell
Но данные от python скрипта доходят только после его завершения, а мне нужно передавать
данные во время работы скрипта.
    


Ответы

Ответ 1



Это типичная проблема сопряжения разнородных систем (не только python + node.js). В зависимости от специфики задачи, для передачи данных между подсистемами могут использоваться потоки ввода-вывода, socket-соединения, разделяемая память, различные IPC решения и множество других методов. В общем случае, когда подсистемы находятся на разных машинах (физических или виртуальных), задача может быть решена через использование посредника для передачи сообщений из одной подсистемы в другую. Хорошим (хотя и несколько избыточным) решением может быть очередь сообщений: ActiveMQ, RabbitMQ и т.д. Можно попробовать использовать Redis, с его реализацией Pub/Sub. Если говорить о вашем конкретном случае, то можно попробовать реализовать клиент socket.io в python приложении, и отправлять данные по этому каналу. Мне кажется, это будет одним из самых простых и нетребовательных к ресурсам решений.

среда, 5 февраля 2020 г.

Как объединить два списка/кортежа словарей (например списки записей БД) в Python

#python #python_3x #python_2x #словари #объединение


Имеется два списка словаря:

Первый:

x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]',
'prise':'[70000]', 'status':'[Непродана]'}


Второй:

y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]',
'prise':'[70000]', 'status':'[Непродана]'}


Желаемый результат:

 z = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[нисан]',
'prise':'[70000]', 'status':'[Непродана]'}, {'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}

    


Ответы

Ответ 1



Pandas замечательно справляется с подобными задачами: import pandas as pd def merge(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last')) def merge2(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last') .to_dict('records')) В виде Pandas DataFrame: In [72]: merge(x, y) Out[72]: prise status title 1 [70000] [Непродана] [нисан] 2 [70000] [Продана] [Лада] 3 [70000] [Непродана] [БМВ] В виде списка словарей: In [73]: merge2(x, y) Out[73]: [{'prise': '[70000]', 'status': '[Непродана]', 'title': '[нисан]'}, {'prise': '[70000]', 'status': '[Продана]', 'title': '[Лада]'}, {'prise': '[70000]', 'status': '[Непродана]', 'title': '[БМВ]'}]

Ответ 2



z = {} for d in sorted((d for o in (x, y) for d in o), key=lambda d: d['status'] == '[Непродана]'): t = d['title'] if t not in z: z[t] = d z = list(z.values()) print('\n'.join(map(str, z))) # {'title': '[Лада]', 'prise': '[70000]', 'status': '[Продана]'} # {'title': '[нисан]', 'prise': '[70000]', 'status': '[Непродана]'} # {'title': '[БМВ]', 'prise': '[70000]', 'status': '[Непродана]'}

Ответ 3



Обратите внимание первый это не словарь а список, содержащий словари. Объединить словари: x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'} y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'} x.update(y) print "Value : %s" % x

Найти натуральный ряд

#python #python_3x #python_2x


Есть отсортированный list с целыми числами. Размер - от 4 до 5 элементов. Как определить,
являются ли 4 числа, входящие в коллекцию натуральным рядом? Может есть, что-то лучше
чем(какая-нибудь встроенная функция например):

if len(arr) > 4 and (int(arr[-1]) - int(arr[1]) == 3 or int(arr[3]) - int(arr[0]) == 3):
    return True
elif int(arr[3]) - int(arr[0]) == 3:
    return True
else:
    return False

    


Ответы

Ответ 1



Если список отсортирован по возрастанию, то можно сравнить его с range(): In [1]: lst = [4,5,6,7,8] In [2]: lst == list( range(min(lst), max(lst)+1) ) Out[2]: True

Ответ 2



Натуральный ряд - неограниченно продолжающийся ряд целых положительных чисел, расположенных в порядке их возрастания: 1,2,3,4,5. def natural_series(x): for i in range(4): if x[i] == x[i + 1] - 1: return True else: return False

пятница, 31 января 2020 г.

Python2.7 ускорение работы кода, сложение огромных 2хмерных массивов

#python #оптимизация #python_2x


Есть два двумерных массива (например, ndarray):  


3000х4000 (12 000 000 элементов) - 2,5D карта высот - назовем Массив1  
100Х100 (10 000 элементов) - форма фрезы - назовем Массив2


Задача: нужно обойти "карту высот" "фрезой" и рассчитать 3й массив "оставшийся недорез"
для каждого пикселя из Массива1.

Проблема в том, что получается 3000Х4000Х100Х100=120 000 000 000 точек, и над каждой
нужно провести одну операцию вычитания, одну операцию сравнения на меньше, и несколько
операций записи.

Python 2.7 делает это ооочень медленно(на моем компе рассчитывает около 14 часов)

Подскажите, пожалуйста, как можно ускорить работу python скрипта?

Используемый алгоритм простой:

Цикл X по СтрокамМатрицы1: #3000
  Цикл Y по СтрокамМатрицы1: #4000
    Цикл N по СтрокамМатрицы2: #100
      Цикл M по СтрокамМатрицы2: #100
        ВремТочка = матр1[X+N,Y+M] - матр2[N,M]
        Если Матр3[X+N,Y+M] > ВремТочка:
          Матр3[X+N,Y+M] = ВремТочка


В реальности есть еще несколько дополнительных операций, но на суть это не влияет.

Вот используемый код:

 def get_rmf_map_tool(self,offset_image,tool_roughing,previous_offset,pixelstep_roughing):

        #Dictionary faster then array
        map_tool1 = {}  #numpy.zeros((self.w, self.h), numpy.float32) - self.image.min()
        y = x = 0   #init y,x for speed

        ts_roughing = tool_roughing.shape[0]

        max_line,max_pix = self.get_im_maxmin(self.w, self.h, ts_roughing)

        jrange = self.mxrange(self.row_mill, max_line, pixelstep_roughing)
        irange = self.mxrange(self.row_mill, max_pix)
        ln = max_line

        if prn_detal > 0: print "(Previous tool shape: {0} pixels, max line: {1},
max pixel: {2} )".format(ts_roughing,max_line,max_pix)

        trange = xrange(0,ts_roughing)

        for lin in jrange:    #lines
            progress(lin, ln)
            for pix in irange:    #pixels

                if self.row_mill:
                    y,x = lin,pix
                else:
                    x,y = lin,pix

                m1 = offset_image[y:y+ts_roughing, x:x+ts_roughing]
                hhh1 = (m1 - tool_roughing).max() + previous_offset

                for i in trange:    #lines tool
                    for j in trange:    #pixels tool

                        t = tool_roughing[i,j]
                        if isinf(t): continue

                        ty = i+y
                        tx = j+x
                        # self.image[ty,tx] <= hhh1 !!! t >= 0
                        dt = -self.image[ty,tx] + hhh1 + t
                        #dt = round(dt,16)

                        if dt < -epsilon and prn_detal > -1: print(" delta < -0.00001
",ty,tx,dt,self.image[ty,tx], hhh1, t)
                        if dt < .0: dt = .0

                        try:
                            if map_tool1[ty,tx] > dt:   #finde MAX for this pixel
                                map_tool1[ty,tx] = dt
                        except KeyError:
                            map_tool1[ty,tx] = dt

        if prn_detal > 0: print "(End make map tool1. Map len: {0} pixels. End at
{1})".format(len(map_tool1),datetime.now())
        if len(map_tool1) == 0 and prn_detal > -1: print "(WARNING! Map tool1 len:
{0}! )".format(len(map_tool1))


Принимаются любые предложения: ассемблер, ctypes, cython, средствами графического
процессора, OpenGL, Numpy, CUDA, ... Желательно с примером.
    


Ответы

Ответ 1



Увы, если ничего принципиально не менять в алгоритме, то разве что средствами графического процессора. На таких данных, пишите вы для процессора хоть на ассемблере, быстро не получится. Вот пример, чтоб не быть голословным: int main() { int i, j, k, l; long z = 0; for (i = 0; i < 300; ++i) for (j = 0; j < 4000; ++j) for (k = 0; k < 100; ++k) for (l = 0; l < 100; ++l) z++; } Как вы видите, я первый параметр уменьшил в 10 раз (ну допустим вы распараллелите на гипотетические 10 ядер), и вот, что получилось на не самом слабом компьютере: $ gcc test.c -o test $ time ./test ./test 31,72s user 0,00s system 99% cpu 31,728 total То есть почти 32 секунды, и это на чистом C с минимумом операций. Ну, будет, допустим, 20 секунд на самом современном процессоре, вряд ли это можно назвать быстро. Обновление: написал вашу логику на Cython: import numpy as np cimport numpy as np def calc( np.ndarray[np.double_t, ndim=2] A, np.ndarray[np.double_t, ndim=2] B, np.ndarray[np.double_t, ndim=2] C): cdef int N1 = A.shape[0] cdef int M1 = A.shape[1] cdef int N2 = B.shape[0] cdef int M2 = B.shape[1] cdef int i, j, k, l cdef double tp if N1 != C.shape[0] or M1 != C.shape[1]: raise ValueError('Array dimensions mismatch') for k in range(N2): for l in range(M2): for i in range(N1 - N2): for j in range(M1 - M2): tp = A[i + k, j + l] - B[k, l] if C[i + k, j + l] > tp: C[i + k, j + l] = tp Тестовый код (опять в 10 раз меньше данных, чтоб не ждать долго): import numpy as np import calc N, M = 300, 4000 n, m = 100, 100 A = np.random.random((N, M)) B = np.random.random((n, m)) C = np.random.random((N, M)) calc.calc(A, B, C) Вот пример запуска: $ time python2 test.py python2 test.py 36,68s user 0,05s system 99% cpu 36,734 total То есть ненамного дольше, чем на чистом C. На полных данных точно укладывается в ваше время. Обновление 2: ради интереса запустил на полных данных (массив размера 3000x4000), и получил следующий результат: $ time python2 test.py python2 test.py 1572,55s user 2,11s system 99% cpu 26:16,10 total В 30 минут уложились, но, конечно, получилось не так быстро, как хотелось бы. Предполагаю, это из-за того, что данные перестали помещаться в кэш. Скорее всего, если разбить большой массив на 10 меньших (которые будут попадать в кэш) и последовательно обработать их, получится гораздо быстрее. Можете попробовать сами, в обработке таких массивов будет пара тонких моментов, так что в рамках ответа на вопрос мне такой код писать лень.

среда, 29 января 2020 г.

Как ограничить время работы сценария?

#python #windows #python_2x


Как ограничить время работы сценария? Например я поставил чтобы через 5 минут программа
закрылась, она работает и как только 5 минут пройдет программа закроется. Как это можно
реализовать? В windows.
    


Ответы

Ответ 1



Код сценария выполняется в функции run. Функция join ждет указанное количество времени, блокируя дальнейшее выполнение кода в главном потоке. После окончания указанного времени скрипт напечатает в консоль сообщение и закроется. Параметр daemon=True указывает, что поток при завершении главного потока также завершится: import threading def run(): import time i = 1 # Бесконечный цикл while True: print i i += 1 time.sleep(1) if __name__ == '__main__': thread = threading.Thread(target=run) thread.daemon = True thread.start() thread.join(5 * 60) print 'Quit!'

Ответ 2



варант 1 простой import time start_time=time.time() while (time.time() - start_time) < 300: pass # ваши действия вариант 2 import multiprocessing import time def your_func(): pass # ваши действия if __name__ == '__main__': p = multiprocessing.Process(target=your_func) p.start() # Ждём 300 секунд (5 минут) p.join(300) # Если процесс живой,то убиваем его if p.is_alive(): print "Kill it." # Terminate p.terminate()

Ответ 3



import time start_time = time.time() CLOSE_AFTER = 300 # время указывается в секундах, текущее - 5 минут while True : # основные действия if time.time() > start_time + CLOSE_AFTER: break

Парсинг Excel файл

#python #python_3x #парсер #excel #python_2x


Как парсить Excel файл с помощью Python и взять данные именно с нужных столбцов?
    


Ответы

Ответ 1



Пример с использованием модуля Pandas: import pandas as pd # pip install pandas df = pd.read_excel(r'D:\download\1.xls', sheet_name='Лист1') print(df) вывод: Артикул Наименование Тариф (прайс) на 12.06.83 0 а123 Товар А 100 1 б123 Товар Б 200 2 в123 Товар В 300 в виде обычных Vanilla Python списков или Numpy Array: In [20]: df['Артикул'].tolist() Out[20]: ['а123', 'б123', 'в123'] In [21]: df.values Out[21]: array([['а123', 'Товар А', 100], ['б123', 'Товар Б', 200], ['в123', 'Товар В', 300]], dtype=object) In [22]: df.values.tolist() Out[22]: [['а123', 'Товар А', 100], ['б123', 'Товар Б', 200], ['в123', 'Товар В', 300]] In [23]: df.T.values.tolist() Out[23]: [['а123', 'б123', 'в123'], ['Товар А', 'Товар Б', 'Товар В'], [100, 200, 300]] PS Pandas поддерживает работу с XLSX и XLS форматами и умеет использовать следующие модули: xlrd, xlwt openpyxl xlsxwriter

Ответ 2



Вот эта библиотека решит ваши вопросы: openpyxl Вот пример кода, как можно работать с xlsx from openpyxl import load_workbook workbook = load_workbook('/tmp/data.xlsx', use_iterators=True) first_sheet = workbook.get_sheet_names()[0] worksheet = workbook.get_sheet_by_name(first_sheet) for row in worksheet.iter_rows(): print row # check out the last row for cell in row: print cell Там же вы сможете найти полный tutorial как ей пользоваться и как читать нужные страницы и ячейки.

вторник, 28 января 2020 г.

Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?

#python #python_3x #python_2x #время


Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?

Например, мне нужно, чтобы скрипт автоматически вывел куда-нибудь (да хоть в текстовый
файл) все возможные варианты дата:время (например MM/DD/YYYY:hh:mm:ss), которые присутствуют
в интервале 10/25/2015:00:00:05 - 10/25/2015:23:59:58 с шагом, например 33 секунды.

В моем видении, вывод должен быть таким:

10/25/2015:00:00:05
10/25/2015:00:00:39
...
10/25/2015:14:27:28
...
10/25/2015:21:49:18

    


Ответы

Ответ 1



Используйте модуль datetime: datetime.datetime -- для хранение времени datetime.timedelta -- для увеличения времени на указанное значение времени strptime -- для разбора объекта datetime.datetime по шаблону strftime -- для получения строки с датой из объекта datetime.datetime по шаблону Пример: import datetime as DT date_fmt = '%m/%d/%Y:%H:%M:%S' step = DT.timedelta(seconds=33) start_date = DT.datetime.strptime('10/25/2015:00:00:05', date_fmt) last_date = DT.datetime.strptime('10/25/2015:23:59:58', date_fmt) while start_date <= last_date: print(start_date, '|', start_date.strftime(date_fmt)) start_date += step # 2015-10-25 00:00:05 | 10/25/2015:00:00:05 # 2015-10-25 00:00:38 | 10/25/2015:00:00:38 # 2015-10-25 00:01:11 | 10/25/2015:00:01:11 # 2015-10-25 00:01:44 | 10/25/2015:00:01:44 # 2015-10-25 00:02:17 | 10/25/2015:00:02:17 # ...

Ответ 2



Ленивый вариант с использованием модуля Pandas: import pandas as pd # pip install pandas / conda install pandas DT_FMT = "%m/%d/%Y:%H:%M:%S" def get_date_range(dt_from, dt_to, freq="1D", dt_fmt=DT_FMT, **kwargs): dt_from = pd.to_datetime(dt_from, format=dt_fmt) dt_to = pd.to_datetime(dt_to, format=dt_fmt) return pd.date_range(dt_from, dt_to, freq=freq, **kwargs) (get_date_range("10/25/2015:00:00:05", "10/25/2015:23:59:58", freq="33S") .to_frame(name="TimeStamp") .to_csv("c:/temp/result.csv", date_format=DT_FMT, index=False)) Результат (C:\temp\result.csv): TimeStamp 10/25/2015:00:00:05 10/25/2015:00:00:38 10/25/2015:00:01:11 ... 10/25/2015:23:58:20 10/25/2015:23:58:53 10/25/2015:23:59:26

Ответ 3



Можно с помощью встроенной функции range: from datetime import datetime, timedelta f = '%m/%d/%Y:%H:%M:%S' beg, fin = [datetime.strptime(d, f) for d in ['10/25/2015:00:00:05', '10/25/2015:23:59:58']] step = 33 ts = [beg + timedelta(seconds=s) for s in range(0, int((fin - beg).total_seconds() + 1), step)] В ts будет: ['10/25/2015:00:00:05', '10/25/2015:00:00:38', '10/25/2015:00:01:11', ... '10/25/2015:23:58:20', '10/25/2015:23:58:53', '10/25/2015:23:59:26'] Демо.

Как разложить двузначное число на два однозначных

#python #python_2x


Например 43 на 4 и 3. В стандартной библиотеке ничего подходящего не нахожу или плохо
знаю математику. Кроме костылей, типа перевести число в строку и разбить, ничего путного
в голову не приходит.
    


Ответы

Ответ 1



то, что вы хотите получить - это остаток и частное от целочисленного деления на 10

Ответ 2



Для двухзначного числа достаточно divmod() вызывать: >>> divmod(43, 10) (4, 3) В общем случае, ничего плохого нет в том чтобы в строку преобразовать: >>> " + ".join(str(123)) '1 + 2 + 3' # сумма цифр (выражение) Если нужно, чтобы отдельные цифры имели тип int, то достаточно map() вызвать: >>> sum(map(int, str(123))) 6 # сумма цифр (результат) Вариант digits = str(number) является читаемым и, не измеряя скорость, я бы не стал предполагать, что работает быстрее для разных входных диапазонов: вариант с map(int, str(number)) или вариант, который явное деление на 10 (основание системы счисления) использует: def digits(n, result=[]): return digits(n//10, [n%10] + result) if n else result or [0] или код с явным циклом: def digits(n): result = [] while n: n, digit = divmod(n, 10) result.append(digit) result.reverse() return result or [0] Пример: >>> digits(123) [1, 2, 3] Для больших n (миллионы цифр) последний вариант мог бы быть более предпочтительным, так как str(long) в СPython является квадратичной операцией, а представленная реализация с явным циклом имела бы линейную сложность, если бы n, digit = divmod(n, 10) за постоянное время выполнялся.

Ответ 3



def ttt(n): l = [] while (n > 0): l.insert(0, n%10) n = n/10 return l print ttt(15896) Для 3-его придется править. ИМХО, через строку - проще. П.С. - только для положительных чисел))

Ответ 4



Я думаю такое число может состоять не только из двух цифр. Незнаю как в python, но в php я бы делал так: перевел в строку и обращался по номеру символа. Что-то вроде такого:

воскресенье, 26 января 2020 г.

Не везде отображаются русские символы

#python #кодировка #utf_8 #python_2x


С чем может бы связано непринятие русского языка во Втором питоне на некоторых машинах?

Например на Fedora 22  после добавления в скрипт:

# -*- coding: utf -*-


проблема решалась, и русские буквы появлялись на экране.

На CentOS 7  такой финт не проходит, ругается:


  SyntaxError: Non-ASCII character '\xd0' in file file.py on line 20, 
      but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


Ругается он на первую попавшуюся функцию:

def err():
    print ("Укажите логин, Фамилия, Имя, Отчество")
    sys.exit(0)


При этом пробовал строку: 

# -*- coding: utf -*-


менять на:

# -*- coding: utf-8 -*-


не помогло.

А на другой машине с такой же CentOS7, русский отображается нормально.

Версия на CentOS7 - Python 2.7.5 (default, Jun 24 2015, 00:41:19)

Версия на fedora 22 - Python 2.7.10 (default, Jul  5 2015, 14:15:43)

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

В чем проблема и как ее можно решить?

Перейти на третью версию можно и, скорее всего, нужно, но сейчас именно по 2 вопрос.
    


Ответы

Ответ 1



гипотезы и общие соображения: согласно pep-у (ссылка есть и в самом вопросе) в поисках coding: кодировка просматриваются лишь первая и вторая строки файла. возможно, в начале файла есть bom-ы или в первые строки «затесались» другие нечитабельные символы, что можно обнаружить, просматривая файл побайтово, например, так: $ hexdump -C файл | less возможно, в начале файла присутствуют переводы строк «не той системы» (для unix-like должны быть \n), либо их смесь. как проверить — см. предыдущий пункт.

пятница, 24 января 2020 г.

Ошибка “WindowsError” при попытке переименовать файл с помощью os.rename()

#python #django #python_2x


Окружение:

Windows 8

Python 2.7.9

Django 1.6

openpyxl (для работы с файлами формата "*.xlsx")

Основная задача:
Получить от пользователя файл формата "*.xlsx", прочитать его и загрузить данные
в Систему.

Шаг на котором возникает проблема:
попытка переименовать файл (для приведения к нужному типу)

Traceback:

File "C:\PythonPtoject\venv\Mygtn\lib\site-packages\django\core\handlers\base.py"
in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\PythonPtoject\project\MyGtn\MyGtn\AppGtn\views.py" in appgtn_import_in_system
  266.     os.rename(abs_file_data,abs_file_data_path + '.' + file_extension)

Exception Type: WindowsError at /register/import_in_system/
Exception Value: 32 ������� �� ����� �������� ������ � �����


Пояснения:

Для получения файла от пользователя использую простой html ("<" и ">" убрал специльно):

form action="/register/import_in_system/" method="post" 
    enctype="multipart/form-data">{% csrf_token %}

    input type="file" name="file_to_import">
    button type="submit">Загрузить файл импорта

/form


После выбора пользователем файла и нажатия кнопки "Загрузить файл импорта" файл сохраняется
во временную папку (механизм сохранения по умолчанию) с расширением "*.upload"

Пример: C:\users\sss\appdata\local\temp\t6rjr4.upload

Данное расширение openpyxl не понимает, поэтому я пытаюсь переименовать файл, а точнее
сменить у него расширение с ".upload" на ".xlsx" используя os.rename()

код с переименованием: 

abs_file_data  = 'c:\\users\\sss\\appdata\\local\\temp\\t6rjr4.upload' # (текущий
абсолютный путь до файла)
abs_file_data_path  = 'c:\\users\\sss\\appdata\\local\\temp\\t6rjr4' # (абсолютный
путь до файла без расширения)
file_extension = u'xlsx' # (новое расширение файла) 
os.rename(abs_file_data,abs_file_data_path + '.' + file_extension)


Но при попытке выполнить эту строчку возникает указанная выше ошибка.
    


Ответы

Ответ 1



Попробуйте переименовывать не после загрузки, а средствами Django указывать правильный путь загрузки (вместе с названием файла) def content_file_name(instance, filename): ext = os.path.splitext(filename) filename = "%s_%s.%s" % (instance.user.id, instance.id, ext) return os.path.join('uploads', filename) class MyFileUpload(models.Model): # ... file = models.FileField(upload_to=content_file_name)

Тест, экспортированный с Selenium не воспроизводится на Python

#python #python_2x #selenium


При воспроизведении теста, экспортированного из Selenium производится такая ошибка:


  ERROR: test_fdefd (main.Fdefd)


Traceback (most recent call last):
  File "C:\Users\user\Desktop\Tests\fdefd.py", line 12, in setUp
    self.driver = webdriver.Firefox()
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line
80, in __init__
    self.binary, timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\extension_connection.py",
line 52, in __init__
    self.binary.launch_browser(self.profile, timeout=timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_binary.py",
line 68, in launch_browser
    self._wait_until_connectable(timeout=timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_binary.py",
line 108, in _wait_until_connectable
    % (self.profile.path))
WebDriverException: Message: Can't load the profile. Profile Dir: c:\users\user\appdata\local\temp\tmpeywhqv
If you specified a log_file in the FirefoxBinary constructor, check it for details.



  Ran 1 test in 93.277s
  
  FAILED (errors=1)


Код программы:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Fdefd(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://bugscatcher.net/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_fdefd(self):
        driver = self.driver
        driver.get("http://automated-testing.info/t/selenium-podbiraem-lokatory/2269")
        driver.find_element_by_id("site-logo").click()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    


Ответы

Ответ 1



Код который генерирует Selenium IDE, надо править, но вы сможете это не раньше чем поймете что и где в коде происходит. Не буду гадать что вы пытались проверить своим тестом, но например найти в яндексе слово "Selenium" , а потом проверить что в результатах есть их сайт можно следующим способом. (Python 3.x). Если нужны будут пояснения по коду, можете обращаться. import unittest from selenium import webdriver class testClass(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.get("https://www.yandex.ru") self.driver.implicitly_wait(10) def test_log_in(self): element_input = self.driver.find_element_by_xpath('//input[@id="text"]') element_input.send_keys('Selenium') element_button_find = self.driver.find_element_by_xpath('//div[@class="search2__button"]/button') element_button_find.click() try: self.driver.find_element_by_link_text('Selenium - Web Browser Automation') except Exception as err: print('Some error:', err) def tearDown(self): print("Close browser") self.driver.close() if __name__ == "__main__": unittest.main()

воскресенье, 12 января 2020 г.

Как сделать юникодную строку читабельной?

#python #кодировка #python_2x


Что делать если при чтении списка - символы читабельны, а после его конвертации в
строку - теряют читабельность? Что делать со строкой? Научите.

Например:

for i in range(0, len(fullTEXT)):
    print fullTEXT[i].text
    textList.append(fullTEXT[i].text)


Известно, что нервные клетки

fullTEXT = str(textList)
print fullTEXT


[u'\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0440\u0432\u043d\u044b\u0435
\u043a\u043b\u0435\u0442\u043a\u0438']
    


Ответы

Ответ 1



Если Ваша цель - получить одну строку из списка строк, хранящихся в списке, можно сделать, что-то вроде: >>>fullTEXT = [u'Известно, что нервные клетки', u'не восстанавливаются'] >>>print ' '.join(fullTEXT) Известно, что нервные клетки не восстанавливаются Если же цель другая, опишите чего хотите добиться, выполняя: fullTEXT = str(textList) print fullTEXT Совет. Ваш цикл: for i in range(0, len(fullTEXT)): print fullTEXT[i].text textList.append(fullTEXT[i].text) можно упростить убрав len и range: for item in fullText: print item.text textList.append(item.text)

Ответ 2



Можно примерно так: >>> mylist = [u"Известно, что нервные клетки", u"Что-то совсем другое"] >>> print u'[%s]' % ', '.join(['"%s"' % item for item in mylist]) ["Известно, что нервные клетки", "Что-то совсем другое"]

Бесконечный Шум Перлина в python

#python #python_2x


Мне для разработки игры нужно использовать Шум Перлина, но мне нужна функция для
бесконечного шума. То есть она должна принимать в качестве параметров: seed - ключ
по которому будет генерироваться шум; x и y координаты точек.
Выдавать в конце он должен число от 0 до 255. То есть для игры высоту точки с данными
кординатами.
Вот нормальный Шум Перлина:



Так как я не нашёл способа создания в python бесконечного Шума Перлина, попытался
создать свой, но получилось совсем не то, и очень медленно:



Подскажите пожалуйста как исправить это. Мне детальность шума особо не важна если
сильно замедляется.

Мне нужно что-то вроде:

    


Ответы

Ответ 1



В итоге я просто установил библиотеку noise pip install noise в терминале, затем по совету пользователя andreymal в скрипте уменьшил координаты точек на 0.05 и вместо seed выбрал 3D шум вместо 2D в котором вместо оси Z подставил seed. Получилось: import noise s = noise.pnoise3(float(x)*0.05, float(y)*0.05, seed, 1) Где 1 - детальность шума. s = s*100.0 Это для удобства использования. Также библиотеку noise можно скачать на сайте https://pypi.python.org/pypi/noise/