четверг, 19 января 2017 г.
вторник, 6 декабря 2016 г.
понедельник, 21 ноября 2016 г.
latex math to png
import getopt
import os
import subprocess
import sys
import tempfile
def __build_preamble():
preamble = '\documentclass[a4paper, 12pt]{article}\n'
preamble += \
"""
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\\vskip 0.5 cm
\pagestyle{empty}
"""
preamble += "\\begin{document}\n"
return preamble
def math2png(eqs, outdir, prefix = '', size = 1):
# Set the working directory
workdir = tempfile.gettempdir()
# Get a temporary file
fd, texfile = tempfile.mkstemp('.tex', 'eq', workdir, True)
# Create the TeX document
with os.fdopen(fd, 'w+') as f:
f.write(__build_preamble())
for eq in eqs:
f.write("$%s$\n" % eq.strip())
f.write('\end{document}')
f.close()
# Generate the DVI file
latexcmd = 'latex -halt-on-error -output-directory %s %s' % (workdir, texfile)
_run(latexcmd.split())
# Convert the DVI file to PNG's
dvifile = texfile.replace('.tex', '.dvi')
outprefix = os.path.join(outdir, prefix)
dvicmd = "dvipng -T tight -x %i -z 9 -bg Transparent "\
"-o %s%%d.png %s" % (size * 1000, outprefix, dvifile)
_run(dvicmd.split())
def _run(cmd):
env = os.environ.copy()
env.update(dict(
LANG='ru_RU.UTF-8',
LC_CTYPE='ru_RU.UTF-8',
HOME='/root',
))
subprocess.Popen(
cmd,
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
).communicate()
hideme proxy python
#encoding:utf-8
import httplib
import mechanize
import random
import time
import urllib
import urllib2
def initial_hideme():
url = 'http://hideme.ru/login'
params = urllib.urlencode({'c': '193477955'})
urllib.urlopen(url, params)
class IpProxyDNotExist(Exception):
pass
def get_good_proxy():
goods = []
test_url = 'http://example.com'
count = 4
def check(ip):
br = mechanize.Browser()
br.set_proxies({'http': ip})
br.set_handle_robots(False)
try:
br.open(test_url, timeout=2)
except (urllib2.URLError, httplib.BadStatusLine):
pass
else:
goods.append(ip)
proxy_list = get_proxy_list()
random.shuffle(proxy_list)
proxy_list = proxy_list[:count]
for num, ip in enumerate(proxy_list):
if goods:
continue
check(ip)
try:
ret = goods[0]
except IndexError:
raise IpProxyDNotExist
return ret
def get_proxy_list():
response = urllib2.urlopen('http://hideme.ru/api/proxylist.php?anon=4&out=plain')
response_text = response.read().strip()
ret = response_text.split()
return ret
Код сайта kontrolnaya-rabota.ru
equations/detailed.py:
# -*- coding: utf-8 -*-
from hideme_proxy import get_good_proxy
from mechanize._response import response_seek_wrapper
from wolfram.utils import get_appid, get_user_agent
import mechanize
import time
import urllib
import random
import re
import xml.etree.ElementTree as ET
def get_inequal_detailed(list_data):
expressions = []
for data in list_data:
solve1 = data['solve1']
solve2 = data['solve2']
oper = data['oper']
expression = '%s%s%s' % (solve1, oper, solve2)
expressions.append(expression)
text = ' and '.join(expressions)
expression_quote = urllib.quote(text)
appid = get_appid()
url_pattern = 'http://api.wolframalpha.com/v2/query?input=Solve+{0}&appid={1}&format=plaintext'
url = url_pattern.format(expression_quote, appid)
br = mechanize.Browser()
br.set_handle_robots(False)
br.set_handle_equiv(False)
ip = get_good_proxy()
br.set_proxies({'http': ip})
ua = get_user_agent()
br.addheaders = [('User-agent', ua)]
br.open(url)
response = br.response()
response_text = response.read()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
elems = root.findall("./pod[@id='Result']/subpod/plaintext")
ret = [el.text for el in elems]
return ret
raise NotImplementedError(response_text)
def get_equal_detailed(data):
solve1 = data['solve1']
solve2 = data['solve2']
expression = '%s=%s' % (solve1, solve2)
expression_quote = urllib.quote(expression)
appid = get_appid()
url_pattern = 'http://api.wolframalpha.com/v2/query?input=Solve+{0}&appid={1}&format=plaintext&podstate=Result__Step-by-step+solution'
url = url_pattern.format(expression_quote, appid)
ip = get_good_proxy()
br = mechanize.Browser()
br.set_proxies({'http': ip})
ua = get_user_agent()
br.addheaders = [('User-agent', ua)]
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.open(url)
response = br.response()
response_text = response.read()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
text = root.find("./pod//subpod[@title='Possible intermediate steps']/plaintext").text
return text
raise NotImplementedError(response_text)
def test_appid(appid):
url = 'http://api.wolframalpha.com/v2/query?input=Solve+x^2-1&appid={0}&format=plaintext&podstate=Result__Step-by-step+solution'.format(appid)
ip = get_good_proxy()
br = mechanize.Browser()
br.set_proxies({'http': ip})
ua = get_user_agent()
br.addheaders = [('User-agent', ua)]
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.open(url)
response = br.response()
response_text = response.read()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
return 'OK'
return response_text
buy/views.py:
# encoding:utf-8
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.shortcuts import redirect, render
from django.utils.translation import ugettext as _
from django.views.decorators.cache import cache_page
from latexmath2png import math2png
from s.buy.forms import FreeForm, FreeFormWithoutCaptha
from s.equal_one.detailed import get_equal_detailed
from settings import at_project_root
from wolfram.base import get_solution_class
import datetime
import hashlib
import re
import time
def free_old(request):
return redirect('/s/', permanent=True)
def free(request):
form = FreeForm(request.POST or None)
redirect_to = None
if form.is_valid():
cleaned_data = form.cleaned_data
key = generate_key()
base_url = reverse('buy-complete', kwargs={'key': key})
query_string = form.get_request_string(cleaned_data)
redirect_to = '%s?%s' % (base_url, query_string)
context = {'free_form': form, 'redirect_to': redirect_to}
template_name = 's/buy/free.html'
return render(request, template_name, context)
@cache_page(60 * 60)
def buy_complete(request, key):
user_agent = request.META.get('HTTP_USER_AGENT')
if 'Mediapartners-Google' in user_agent or \
'YandexDirect' in user_agent:
return free(request)
if key != generate_key():
return redirect('/s/')
form = FreeFormWithoutCaptha(request.GET or None)
if not form.is_valid():
return redirect(reverse('s-main'))
module = form.cleaned_data['module']
data = form.cleaned_data['data']
if module in ['diff', 'limit']:
SolutionClass = get_solution_class(module)
text = SolutionClass(data, with_proxy=False).get_text()
elif module in ('indefinite', 'definite'):
SolutionClass = get_solution_class('indefinite')
text = SolutionClass(data).get_text()
elif module == 'equal':
text = get_equal_detailed(data)
for trans in BLOCK_I18N:
text = text.replace(trans, _(trans))
text = text.replace('\\n', '\n')
text = text.replace('\\/', '/')
if 'wolfram' in text.lower():
raise ValidationError(u'wolfram text on solution')
tex_body = text_to_tex(text)
prefix = hashlib.md5(tex_body.encode('utf-8')).hexdigest()
try:
math2png(
[tex_body.encode('utf-8')],
'media/buy',
prefix=prefix,
)
except:
with_simple_text = True
else:
with_simple_text = False
time.sleep(3)
template_name = 's/buy/complete.html'
context = {
'tex_body': tex_body,
'prefix': prefix,
'with_simple_text': with_simple_text,
'text': text,
}
return render(request, template_name, context)
def i18n_blocks():
fn = at_project_root('kr/wolfram.trans')
ret = open(fn).read().strip().decode('utf-8').split('\n')
ret = sorted(ret, key=lambda s: len(s), reverse=True)
return ret
BLOCK_I18N = i18n_blocks()
def generate_key():
today_text = datetime.date.today().strftime('%F')
open_key = '%s-%s' % (settings.SECRET_KEY, today_text)
key = hashlib.md5(open_key).hexdigest()
return key
def text_to_tex(text):
fp = '(?:cos|sin|tan|atan|csc|cot|sec|log|ln|sqrt|sinh|cosh|arccos|arcsin|arccosh|arcsinh|arctg|arcctg|atan)'
ac = '[_a-zA-Z@^\d.]'
ac_p = '[_a-zA-Z@^{}\d.]'
text = text.replace('d/dx', '@@@')
text = text.replace('tan^(-1)', 'arctg')
text = text.replace('cos^(-1)', 'arccos')
text = text.replace('sin^(-1)', 'arcsin')
text = text.replace('cot^(-1)', 'arcctg')
text = re.sub(r'\b(sec)\b', '1/sin', text)
text = re.sub(r'd(sec)\b', 'd 1/sin', text)
text = re.sub(r'\b(csc)\b', '1/cos', text)
text = re.sub(r'd(csc)\b', 'd 1/cos', text)
text = re.sub(r'\b(log)\b', 'ln', text)
text = re.sub(r'd(log)\b', 'd log', text)
text = re.sub(r'\b(cot)\b', 'ctg', text)
text = re.sub(r'd(cot)\b', 'd ctg', text)
text = re.sub(r'\b(tan)\b', 'tg', text)
text = re.sub(r'd(tan)\b', 'd tg', text)
text = re.sub(r'lim_\(([^\)]+)\)', r'lim_{\1}', text)
text = re.sub(r'(%(fp)s)\^%(b)s\(' % {
'fp': fp, 'b': get_bucket_pattern_by_level(4)[2:-2]
}, r'\1^{\2}(', text)
A = []
j = 0
for i in range(5):
list_expr = set(re.findall(r'(%(fp)s*\([^\(\)]+\))' % {'fp': fp}, text))
list_expr = sorted(list_expr, key=lambda expr: len(expr))
list_expr.reverse()
for bracket in list_expr:
text = text.replace(bracket, '__III%s__' % j)
A.append(bracket)
j += 1
for j, bucket in enumerate(A):
in_bucket = bucket
if bucket.startswith('('):
in_bucket = in_bucket[1:-1]
in_bucket = re.sub(r'(%(fp)s*%(ac_p)s+)/(%(fp)s*%(ac_p)s+)' % {
'fp': fp, 'ac_p': ac_p
}, r'\\frac{\1}{\2}', in_bucket)
in_bucket = re.sub(r'(%(ac)s+)\^(%(ac)s+)' % {
'ac': ac
}, r'\1^{\2}', in_bucket)
if bucket.startswith('('):
A[j] = '(%s)' % in_bucket
else:
A[j] = in_bucket
text = re.sub(r'(%(fp)s*%(ac_p)s+)/(%(fp)s*%(ac_p)s+)' % {
'fp': fp, 'ac_p': ac_p
}, r'\\frac{\1}{\2}', text)
text = re.sub(r'(%(ac)s+)\^(%(ac)s+)' % {'ac': ac}, r'\1^{\2}', text)
for i in range(5):
for j, backet in enumerate(A):
text = text.replace('__III%s__' % j, backet)
text = text.replace('= | ', '\\\\\\\\ = ').replace(' | ', '\\\\\\\\').replace(' ', '\;').replace('\n', '\\\\\\\\')
text = text.replace("\\'", "'")
text = re.sub(r'{\(([^{}]+)\)}', r'{\1}', text)
text = text.replace('@@@', '\\frac{d}{dx}')
text = text.replace('integral', '\\int')
text = text.replace('·', u'*')
text = text.replace('>infinity', u'>oo')
text = text.replace('>-infinity', u'>-oo')
return text
def get_bucket_pattern_by_level(level):
list_res = []
b0 = '[^\(\)]'
c = '%s+' % b0
list_res.append(c)
for i in range(level):
b = '\((%s)\)' % '|'.join(list_res)
c = '(?:(?:\((?:%s)\))|%s)+' % (b[3:-3], b0)
list_res.append(c)
return b
buy/urls.py:
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('s.buy.views',
url(r'^free/$', 'free_old' , name='free-old'),
url(r'^besplatno/$', 'free' , name='free'),
url(r'^complete/(?P[0-9a-f]+)/$', 'buy_complete', name='buy-complete'),
)
buy/forms.py
# -*- coding: utf8 -*-
from s.models import Ads, ExcludeUrl
from captcha.fields import CaptchaField, CaptchaTextInput
from django import forms
import json
import urllib
BUY_VERSION = 2
class FreeFormWithoutCaptha(forms.Form):
data = forms.CharField(widget=forms.HiddenInput)
module = forms.CharField(widget=forms.HiddenInput)
def clean_data(self):
data = self.cleaned_data['data']
try:
data = json.loads(data)
except:
raise forms.ValidationError('No load json')
return data
def get_request_string(self, cleaned_data):
data = cleaned_data['data']
data = json.dumps(data)
data = urllib.quote(data)
module = cleaned_data['module']
req_string = 'module=%(module)s&data=%(data)s' % {
'module': module, 'data': data,
}
return req_string
if BUY_VERSION == 1:
class FreeForm(FreeFormWithoutCaptha):
url = forms.URLField(
help_text=(
u'URL страницы, где содержится активная ссылка на мой сайт'
), label=u'Url страницы',
)
captcha = CaptchaField()
def __init__(self, *args, **kwargs):
super(FreeForm, self).__init__(*args, **kwargs)
self.fields['captcha'].widget.attrs = {'autocomplete': "off"}
def clean_url(self):
url = self.cleaned_data['url'].lower()
exclude_urls = ExcludeUrl.objects.all().values_list('url', flat=True)
for exclude_url in exclude_urls:
if url.startswith('http://' + exclude_url) or \
url.startswith('http://www.' + exclude_url):
raise forms.ValidationError(
(u'Котэ следит за тобой. Пожалуйста, добавьте ссылку себе на '
u'сайт, форум или блог!')
)
return url
def get_ads(self):
ads = Ads.objects.random()
return ads
elif BUY_VERSION == 2:
class FreeForm(FreeFormWithoutCaptha):
captcha = CaptchaField()
def __init__(self, *args, **kwargs):
super(FreeForm, self).__init__(*args, **kwargs)
self.fields['captcha'].widget.attrs = {'autocomplete': "off"}
def get_ads(self):
ads = Ads.objects.random()
return ads
wolfram/utils.py
# coding:utf-8
from settings import at_project_root
import random
def get_appid():
filename = at_project_root('kr/wolfram.keys')
appid_list = open(filename).read().strip().split()
random.shuffle(appid_list)
appid = appid_list[0]
return appid
def get_user_agent():
filename = at_project_root('kr/wolfram.ua')
ua_list = open(filename).read().strip().split('\n')
assert len(ua_list) > 1
random.shuffle(ua_list)
ua = ua_list[0]
return ua
wolfram/base.py
#encoding:utf-8
from hideme_proxy import get_good_proxy, IpProxyDNotExist
from wolfram.utils import get_user_agent, get_appid
import httplib
import mechanize
import urllib
import urllib2
import xml.etree.ElementTree as ET
import zlib
_open_url_error_classes = (
urllib2.HTTPError,
urllib2.URLError,
IOError,
httplib.BadStatusLine,
httplib.IncompleteRead,
zlib.error, # for gzip compressed responses
IpProxyDNotExist,
)
class InternetError(Exception):
pass
def get_solution_class(class_name):
return SOLUTION_CLASSES[class_name]
SOLUTION_CLASSES = {}
def register_solution_class(class_name):
def wrapper(cls):
SOLUTION_CLASSES[class_name] = cls
return cls
return wrapper
class _InternetObject(object):
def _initial_browser(self):
br = mechanize.Browser()
ua = get_user_agent()
br.addheaders = [('User-agent', ua)]
br.set_handle_robots(False)
br.set_handle_equiv(False)
return br
def _get_rawurlencode(self, params):
items = []
for key, val in params.items():
new_val = urllib.quote(val)
item = '{0}={1}'.format(key, new_val)
items.append(item)
ret = '&'.join(items)
return ret
def get_params(self):
raise NotImplementedError
class DetailedSolution(_InternetObject):
base_url = 'http://api.wolframalpha.com/v2/query'
def __init__(self, data, with_proxy=True):
self.data = data
self.with_proxy = with_proxy
self.br = self._initial_browser()
self.appid = get_appid()
def __str__(self):
super_str = super(DetailedSolution, self).__str__()
ret = '{0} with appid={1}'.format(super_str, self.appid)
return ret
def get_text(self):
response_text = self.get_response_text()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
xpath = "./pod//subpod[@title='Possible intermediate steps']/plaintext"
text = root.find(xpath).text
return text
raise NotImplementedError(response_text)
def get_response_text(self):
if self.with_proxy:
try:
ip = get_good_proxy()
except _open_url_error_classes, exc:
raise InternetError(exc)
self.br.set_proxies({'http': ip})
params = self.get_params()
params.update({
'format': 'plaintext',
'appid': self.appid,
})
url = self.base_url + '?' + \
self._get_rawurlencode(params)
try:
self.br.open(url)
response = self.br.response()
response_text = response.read()
except _open_url_error_classes, exc:
raise InternetError(exc)
return response_text
@register_solution_class('limit')
class LimitSolution(DetailedSolution):
def get_params(self):
data = self.data
x0 = data['x0']
function = data['function']
expression = 'lim %s x->%s' % (function, x0)
ret = {
'input': expression,
'podstate': 'Limit__Step-by-step solution',
}
return ret
@register_solution_class('indefinite')
class IndefiniteSolution(DetailedSolution):
def get_params(self):
data = self.data
function = data['function']
expression = 'integrate %s' % function
ret = {
'input': expression,
'podstate': 'IndefiniteIntegral__Step-by-step solution',
}
return ret
@register_solution_class('diff')
class DiffSolution(DetailedSolution):
def get_params(self):
data = self.data
function = data['function']
expression = 'derivative of %s' % function
ret = {
'input': expression,
'podstate': 'Input__Step-by-step solution',
}
return ret
@register_solution_class('series-number')
class SeriesNumberSolution(DetailedSolution):
def get_result(self):
ret = {}
response_text = self.get_response_text()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
nods = root.findall('./pod[@id="ConvergenceTests"]/subpod/plaintext')
tests = map(lambda n: n.text, nods)
ret['tests'] = tests
return ret
raise NotImplementedError(response_text)
def get_params(self):
data = self.data
function = data['function']
n = data['n']
n0 = data['n0']
nm = data['nm']
infinity = data['infinity']
if infinity:
nm = 'oo'
expression = 'Sum[{0}, {1}, {2}, {3}]'.format(function, n, n0, nm)
ret = {
'input': expression,
}
return ret
@register_solution_class('power-series')
class PowerSeriesSolution(DetailedSolution):
def get_result(self):
ret = {}
response_text = self.get_response_text()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
nods = root.findall('./pod[@id="ConvergenceTests"]/subpod/plaintext')
tests = map(lambda n: n.text, nods)
ret['tests'] = tests
return ret
raise NotImplementedError(response_text)
def get_params(self):
expression = 'Sum of {function}'.format(**self.data)
ret = {
'input': expression,
}
return ret
@register_solution_class('system-diff')
class SystemDiffSolution(DetailedSolution):
def get_result(self):
ret = {}
response_text = self.get_response_text()
root = ET.fromstring(response_text)
if root.get('success') == 'true':
nods = root.findall('./pod[@id="DifferentialEquationSolution"]/subpod/plaintext')
solves = map(lambda n: n.text, nods)
solves = map(lambda s: s.replace('_', ''), solves)
ret['solves'] = solves
return ret
raise NotImplementedError(response_text)
def get_params(self):
expression = ' and '.join('='.join(i) for i in self.data['equations'])
ret = {
'input': expression,
}
return ret
widgetes/jscalendar.py
from django import forms
from django.template.loader import render_to_string
class JSCalendarWidget(forms.DateTimeInput):
class Media:
css = {
'all': ('javascript/jscalendar-1.0/calendar-system.css',)
}
js = ('javascript/jscalendar-1.0/calendar.js',
'javascript/jscalendar-1.0/calendar-setup.js',
'javascript/jscalendar-1.0/lang/calendar-ru-UTF.js',)
def render(self, name, value, lang='ru', attrs=None):
value = value or ''
return render_to_string("widgets/jscalendar.html", locals())
buy/complete.html
{% extends "s/sbase.html" %}
{% block title %}Подробное решение бесплатно!{% endblock %}
{% block head %}
{% endblock %}
{% block crumbs %}Больше решений!{% endblock %}
{% block base_table %}
{% endblock %}
buy/definite.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm
\begin{document}
${{ tex_body }}$
\end{document}
buy/diff.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm
\begin{document}
${{ tex_body }}$
\end{document}
buy/free_form.html
Для того, чтобы получить подробное решение бесплатно, пожалуйста, проделайте следующие действия:buy/free.html{% if not request.COOKIES.ilikeit %}
- Скопируйте ссылку и
{% endif %}
разместите вконтакте или др. сайте:
- Введите цифры на рисунке
{% extends "s/sbase.html" %}
{% load i18n %}
{% block head %}
{% if redirect_to %}
{% endif %}
{% endblock %}
{% block title %}Подробное решение бесплатно!{% endblock %}
{% block content %}
Подробное решение
{% include "partner_block.html" %}
{% if redirect_to %}
Производится проверка размещения ссылки, пожалуйста подождите чуть больше 1 мин...
Если ссылка на наш сайт будет найдена, то Вам будет предложено решение.
Если программа не найдет ссылку вида http://kontrolnaya-rabota.ru, то Вы не получите файла, но можно попробовать разместить ссылку на сайт http://kontrolnaya-rabota.ru/s/ снова.
Назад.
{% else %}
Хотите получить подробное решение с описанием действий?
{% include "s/buy/free_form.html" %}
{% endif %}
{% include "partner_block.html" %}
{% endblock %}
buy/indefinite.tex
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm
\begin{document}
${{ tex_body }}$
\end{document}
buy/limit.html
\documentclass[a4paper, 12pt]{article}
\usepackage[unicode]{hyperref}
\usepackage{mathtext}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\vskip 0.5 cm
\begin{document}
${{ tex_body|safe }}$
\end{document}
среда, 9 ноября 2016 г.
python regex lazy re.compile
import re
class _Lazy(object):
__slots__ = ['pattern', 'kwargs', 'compiled']
def __init__(self, pattern, **kwargs):
self.pattern = pattern
self.kwargs = kwargs
self.compiled = None
def __getattr__(self, name):
if self.compiled is None:
self.compiled = re.compile(self.pattern, **self.kwargs)
return self.compiled.__getattribute__(name)
def lazy_compile(pattern, **kwargs):
return _Lazy(pattern, **kwargs)
Use:
In [2]:
In [2]: lazy_compile(r'[a-z]')
Out[2]: <__main__._Lazy at 0x11095c088>
In [3]: c = lazy_compile(r'[a-z]')
In [4]: c.findall('sdsd sdsds aq, $A fddf')
Out[4]: ['s', 'd', 's', 'd', 's', 'd', 's', 'd', 's', 'a', 'q', 'f', 'd', 'd', 'f']
понедельник, 23 ноября 2015 г.
Upload a folder to s3
from boto3.session import Session
import os
session = Session(
aws_access_key_id='xxx',
aws_secret_access_key='yyy',
region_name='eu-central-1', # Put your region name
)
resource = session.resource('s3')
bucket = resource.Bucket('your_bucket_name')
from_dir = 'your_folder_name'
for fn in os.listdir(from_dir):
file_obj = open(os.path.join(from_dir, fn), 'rb')
to_folder = ''
bucket.put_object(
Key=os.path.join(to_folder, os.path.basename(file_obj.name)),
Body=file_obj.read(),
)
print '%s loaded' % fn
import os
session = Session(
aws_access_key_id='xxx',
aws_secret_access_key='yyy',
region_name='eu-central-1', # Put your region name
)
resource = session.resource('s3')
bucket = resource.Bucket('your_bucket_name')
from_dir = 'your_folder_name'
for fn in os.listdir(from_dir):
file_obj = open(os.path.join(from_dir, fn), 'rb')
to_folder = ''
bucket.put_object(
Key=os.path.join(to_folder, os.path.basename(file_obj.name)),
Body=file_obj.read(),
)
print '%s loaded' % fn
Подписаться на:
Сообщения (Atom)