Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Загрузка файла с сайта через python.  (Прочитано 3269 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Загрузка файла с сайта через python.
« : 14 Декабря 2015, 22:04:55 »
Здравствуйте, есть несколько программок, которые находят подмассив с максимальной суммой, разными способами.
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd
ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
b = [round(x,4) for x in ar[1]]
b.reverse()
c = [str(x) for x in ar[0]]
c.reverse()
a = [0]
for i in range(1, len(b), 1):
  a.append(b[i] - b[i - 1])


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[0]
    else:
        mid = int((low + high) / 2)
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum

min, max, sum = find_max_subarray(a, 0, len(a))
print(b)
print(a)
print(c)
print(sum," ", min," ", max)
print(sum," ", c[min], " ", c[max])
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd
ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
b = [round(x,4) for x in ar[1]]
b.reverse()
c = [str(x) for x in ar[0]]
c.reverse()
a = [0]
for i in range(1, len(b), 1):
  a.append(b[i] - b[i - 1])


def max_subarray(a):
  pos = left = right = 0
  max_s = s = a[0]
  for i in range(1, len(a)):
    if s < 0:
      s, pos = a[i], i
    else:
      s += a[i]
    if s > max_s:
      max_s, left, right = s, pos, i
  return max_s, left, right

sum, min, max = max_subarray(a)
print(b)
print(a)
print(c)
print(sum," ", min," ", max)
print(sum," ", c[min], " ", c[max])
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd
ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
b = [round(x,4) for x in ar[1]]
b.reverse()
c = [str(x) for x in ar[0]]
c.reverse()
a = [0]
for i in range(1, len(b), 1):
  a.append(b[i] - b[i - 1])


def max_sum(my_list):
    max_sum = 0
    list_length = len(my_list)
    r_border = list_length + 1
    for i in range(list_length):
        for j in range(i + 1, r_border):
            sum_part = sum(my_list[i:j])
            if sum_part > max_sum:
                max_sum, left, right = sum_part, i, j - 1
    return (max_sum, left, right)

sum, min, max = max_sum(a)
print(b)
print(a)
print(c)
print(sum," ", min," ", max)
print(sum," ", c[min], " ", c[max])
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd
ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
b = [round(x,4) for x in ar[1]]
b.reverse()
c = [str(x) for x in ar[0]]
c.reverse()
a = [0]
for i in range(1, len(b), 1):
  a.append(b[i] - b[i - 1])


def find_max_subarray(a, low, high):
    if high == low:
        return low, high, a[0]
    else:
        mid = int((low + high) / 2)
        left_low, left_high, left_sum = find_max_subarray(a, low, mid)
        right_low, right_high, rigth_sum = find_max_subarray(a, mid + 1, high)
        cross_low, cross_high, cross_sum = find_crossing(a, low, mid, high)
        if (left_sum >= rigth_sum) & (left_sum >= cross_sum):
            return left_sum, left_high, left_sum
        elif (rigth_sum >= left_sum) & (left_sum >= cross_sum):
            return right_low, right_high, rigth_sum
        else:
            return cross_low, cross_high, cross_sum


def find_crossing(a, low, mid, high):
    max_left = 0
    max_right = 0
    left_sum = -1e308
    sum = 0
    for i in range(mid, low, -1):
        sum = sum + a[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
            max_right = 0
    right_sum = -1e308
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + a[j]
        if sum > right_sum:
            right_sum = sum
            max_right = j
    return max_left, max_right, left_sum + right_sum

min, max, sum = find_max_subarray(a, 0, len(a))
print(b)
print(a)
print(c)
print(sum," ", min," ", max)
print(sum," ", c[min], " ", c[max])
в 3 строке открывается тот самый файл в котором содержаться курсы валют.
какой можно написать код чтобы этой файл загружался с сайта?
на страницу загрузки нужного мне data.csv я перехожу отсюда:
http://www.oanda.com/currency/historical-rates/
Заранее спасибо.

Пользователь решил продолжить мысль 14 Декабря 2015, 22:07:32:
Можно например как-то из кода вызывать команды командной строки,wget например.
Или можно сделать как-то еще лучше.
« Последнее редактирование: 14 Декабря 2015, 22:07:32 от DenisVASI »

Axa-Ru

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #1 : 14 Декабря 2015, 22:28:36 »

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Загрузка файла с сайта через python.
« Ответ #2 : 14 Декабря 2015, 22:37:26 »
Код: (python) [Выделить]
import urllib
logo = urllib.urlopen("http://www.oanda.com/currency/historical-rates/download?quote_currency=USD&end_date=2015-12-14&start_date=2015-12-8&period=daily&display=absolute&rate=0&data_range=d7&price=bid&view=graph&base_currency_0=RUB&base_currency_1=USD&base_currency_2=&base_currency_3=&base_currency_4=&download=csv").read()

Код: (python) [Выделить]
/usr/bin/python3.4 /home/denis/MaxSubArra/Method2.py
Traceback (most recent call last):
  File "/home/denis/MaxSubArra/Method2.py", line 4, in <module>
    logo = urllib.urlopen("http://www.oanda.com/currency/historical-rates/download?quote_currency=USD&end_date=2015-12-14&start_date=2015-12-8&period=daily&display=absolute&rate=0&data_range=d7&price=bid&view=graph&base_currency_0=RUB&base_currency_1=USD&base_currency_2=&base_currency_3=&base_currency_4=&download=csv").read()
AttributeError: 'module' object has no attribute 'urlopen'

Process finished with exit code 1

что-то не работает

Axa-Ru

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #3 : 14 Декабря 2015, 22:45:40 »
У меня по вашей ссылке ничего не открывается.
Наверное поэтому и не работает.

22:46@axa:~$ ping www.oanda.com
PING oanda-6.hs.llnwd.net (95.140.229.76) 56(84) bytes of data.
^C
--- oanda-6.hs.llnwd.net ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10078ms

22:47@axa:~$ ping www.google.com
PING www.google.com (173.194.32.178) 56(84) bytes of data.
64 bytes from 173.194.32.178: icmp_seq=1 ttl=55 time=1.60 ms
64 bytes from 173.194.32.178: icmp_seq=2 ttl=55 time=1.45 ms
64 bytes from 173.194.32.178: icmp_seq=3 ttl=55 time=1.28 ms
^C
--- www.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.285/1.447/1.600/0.132 ms
« Последнее редактирование: 14 Декабря 2015, 22:47:57 от Axa-Ru »


Axa-Ru

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #5 : 14 Декабря 2015, 22:59:30 »
У меня не скачивается.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Загрузка файла с сайта через python.
« Ответ #6 : 14 Декабря 2015, 23:05:59 »
хм, сам то сайт открывается, может там какая-то "индивидуальная" ссылка?
http://www.oanda.com/currency/historical-rates/
сейчас залью на rghost

Пользователь решил продолжить мысль 14 Декабря 2015, 23:07:59:
Код: (python) [Выделить]
s = urllib.urlopen("http://rghost.ru/7hrkCYl7t").read()

Ничего не изменилось
« Последнее редактирование: 14 Декабря 2015, 23:07:59 от DenisVASI »

Axa-Ru

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #7 : 14 Декабря 2015, 23:23:11 »
ссылка для скачивания с rghost:
http://higgs.rghost.ru/download/7hrkCYl7t/2466582ad0f115c6193f93b57153248678fdc64c/data%20(6).csv
Вставьте ее и попробуйте еще раз
« Последнее редактирование: 14 Декабря 2015, 23:26:57 от Axa-Ru »

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Загрузка файла с сайта через python.
« Ответ #8 : 14 Декабря 2015, 23:28:45 »
И все равно не работает
Код: (python) [Выделить]
s = urllib.urlopen("http://higgs.rghost.ru/download/7hrkCYl7t/2466582ad0f115c6193f93b57153248678fdc64c/data%20(6).csv").read()
AttributeError: 'module' object has no attribute 'urlopen'

Axa-Ru

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #9 : 14 Декабря 2015, 23:41:35 »
Видимо эта библиотека не может открыть динамическую ссылку.
Со статическими все работает:

Код: (python) [Выделить]
23:29@axa:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2
>>> data = urllib2.urlopen("http://www.cbr.ru/currency_base/OldDataFiles/USD.xls")
>>> output = open('usd.xls','wb')
>>> output.write(data.read())
>>> output.close()
>>>

Судя по url оригинальная ссылка тоже динамическая.
Попробуйте другую библиотеку.
Или, если не получится вызовите curl или wget
http://stackoverflow.com/questions/89228/calling-an-external-command-in-python

shura1

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #10 : 15 Декабря 2015, 07:46:29 »
DenisVASI,
Вы путаете модули urllib и urllib2. Вам последний нужен.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Загрузка файла с сайта через python.
« Ответ #11 : 15 Декабря 2015, 15:08:29 »
Единственное что нашел urllib3.
Код: (python) [Выделить]
s = urllib3.urlopen("http://higgs.rghost.ru/download/7hrkCYl7t/2466582ad0f115c6193f93b57153248678fdc64c/data%20(6).csv").read()

Ошибка такая же.

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Загрузка файла с сайта через python.
« Ответ #12 : 15 Декабря 2015, 15:22:43 »
Ошибка
AttributeError: 'module' object has no attribute 'urlopen'
говорит о том что вы неверно ссылаетесь на метод.

Нужно что-то типа
Код: (python) [Выделить]
import urllib.request as rq
s = rq.urlopen(....
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

shura1

  • Гость
Re: Загрузка файла с сайта через python.
« Ответ #13 : 15 Декабря 2015, 15:28:01 »
Вы пользуете Python3, вам ответ дали, используя Python2. Я еще больше запутал. Виноват (ответил по памяти, а она дырявая  :))

В Python3 для открытия url используется urllib.request.urlopen. Как-то так

import urllib.request
req = urllib.request.urlopen('https://www.google.com')
page = req.read()
« Последнее редактирование: 15 Декабря 2015, 15:30:16 от shura1 »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Загрузка файла с сайта через python.
« Ответ #14 : 15 Декабря 2015, 15:37:16 »
Как я понял - там еще и с URL фигня какая-то - я так по нему ничего толкового и не получил (даже wget какую-то муть в файл записал а не csv список значений)
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

 

Страница сгенерирована за 0.078 секунд. Запросов: 25.