Published: 19 Aug 2018 › Updated: 19 Aug 2018

Learn Python with Steem #09 笔记
Learn Python with Steem #09 笔记
[toc]
划重点
- 遍历字典
利用dict.items()方法,用一个循环语句遍历整个字典的所有元素。
- 转换 Reputation 和 Voting Power 的原始数据
直接获取的某些数据是生的,需要煮(转换)一下才能吃。
- 解析时间
使用Python的dateutil和datetime模块来解析和处理时间数据。
编程练习
from steem import Steem
from steem.converter import Converter
# import sys
import math
from dateutil import parser
from dateutil.tz import *
from datetime import datetime, timezone, timedelta
from pprint import pprint
class Steemains(Steem):
def __init__(self, _account_name='yjcps'):
Steem.__init__(self)
self.account_name = _account_name
self.account_info = self.get_account(self.account_name)
@property
def view_account_info(self):
post_count = self.account_info.get('post_count')
balance = self.account_info.get('balance')
created = self.parse_date(
self.account_info.get('created'))
sbd_balance = self.account_info.get('sbd_balance')
vesting_shares = self.parse_vests(
self.account_info.get('vesting_shares'))
delegated_vesting_shares = self.parse_vests(
self.account_info.get('delegated_vesting_shares'))
converter = Converter()
sp = converter.vests_to_sp(vesting_shares)
delegated_sp = converter.vests_to_sp(delegated_vesting_shares)
voting_power = self.parse_voting_power(
self.account_info.get('voting_power'))
reputation = self.parse_reputation(
self.account_info.get('reputation'))
last_post_date = self.parse_date(
self.account_info.get('last_root_post'))
time_since_last_post = datetime.utcnow().replace(
tzinfo=timezone.utc) - last_post_date
days_since_last_post = time_since_last_post.days
# print(_timedelta)
return {
'account_name': self.account_name,
'balance': balance,
'created':
self.utc_2_local_date(created).strftime(
'%Y-%m-%d-%a %H:%M:%S'),
'sbd_balance': sbd_balance,
'vesting_shares': vesting_shares,
'delegated_vesting_shares': delegated_vesting_shares,
'sp': sp,
'delegated_sp': delegated_sp,
'post_count': post_count,
'voting_power': voting_power,
'reputation': reputation,
'last_post_date':
self.utc_2_local_date(last_post_date).strftime(
'%Y-%m-%d-%a %H:%M:%S'),
'days_since_last_post': days_since_last_post
}
def get_post_histry(self):
pass
@staticmethod
def utc_2_local_date(_utcdate):
_timedelta = datetime.now() - datetime.utcnow()
return _utcdate.astimezone(timezone(_timedelta))
@staticmethod
def parse_vests(_vests):
return float(_vests.split()[0])
@staticmethod
def parse_voting_power(voting_power):
return int(voting_power) / 100
@staticmethod
def parse_reputation(raw_reputation):
return (math.log10(int(raw_reputation)) - 9) * 9 + 25
@staticmethod
def parse_date(_date):
utc_date = parser.parse(_date).replace(tzinfo=timezone.utc)
return utc_date
yjcps = Steemains('yjcps')
pprint(yjcps.view_account_info)
{'account_name': 'yjcps',
'balance': '0.437 STEEM',
'created': '2018-01-04-Thu 13:25:18',
'days_since_last_post': 0,
'delegated_sp': 57.07436926020711,
'delegated_vesting_shares': 115562.393455,
'last_post_date': '2018-08-19-Sun 07:01:57',
'post_count': 261,
'reputation': 51.49449059489242,
'sbd_balance': '4.499 SBD',
'sp': 121.35204133768676,
'vesting_shares': 245709.808613,
'voting_power': 68.73}
deanliu = Steemains('deanliu')
pprint(deanliu.view_account_info)
del deanliu
{'account_name': 'deanliu',
'balance': '105.649 STEEM',
'created': '2016-07-14-Thu 13:56:39',
'days_since_last_post': 0,
'delegated_sp': 3028.3048743103254,
'delegated_vesting_shares': 6131616.465781,
'last_post_date': '2018-08-19-Sun 11:23:24',
'post_count': 9998,
'reputation': 74.33099682076877,
'sbd_balance': '189.594 SBD',
'sp': 17333.498512941853,
'vesting_shares': 35096322.630247,
'voting_power': 55.17}
dapeng = Steemains('dapeng')
pprint(dapeng.view_account_info)
del dapeng
{'account_name': 'dapeng',
'balance': '229.299 STEEM',
'created': '2016-10-14-Fri 19:03:39',
'days_since_last_post': 2,
'delegated_sp': 3909.296719340023,
'delegated_vesting_shares': 7915420.822822,
'last_post_date': '2018-08-16-Thu 20:57:21',
'post_count': 5926,
'reputation': 67.26589131476406,
'sbd_balance': '30.081 SBD',
'sp': 5186.613554620994,
'vesting_shares': 10501691.705077,
'voting_power': 69.86}
for key,value in yjcps.view_account_info.items():
print(key,':',value)
account_name : yjcps
balance : 0.437 STEEM
created : 2018-01-04-Thu 13:25:18
sbd_balance : 4.499 SBD
vesting_shares : 245709.808613
delegated_vesting_shares : 115562.393455
sp : 121.35205839875916
delegated_sp : 57.07437728438151
post_count : 261
voting_power : 68.73
reputation : 51.49449059489242
last_post_date : 2018-08-19-Sun 07:01:57
days_since_last_post : 0
display_message = '''
Username: \t{account_name}
Reputation: \t{reputation}
Created:\t{created}
Last Post: \t{last_post_date} ({days_since_last_post} days ago)
===========================================
STEEM Balance:\t{balance}
SBD Balance:\t{sbd_balance}
SP: \t\t{sp}
Delegated SP:\t{delegated_sp}
Total Posts:\t{post_count}
Voting Power:\t{voting_power}%
'''.format(**yjcps.view_account_info)
print(display_message)
Username: yjcps
Reputation: 51.49449059489242
Created: 2018-01-04-Thu 13:25:18
Last Post: 2018-08-19-Sun 07:01:57 (0 days ago)
===========================================
STEEM Balance: 0.437 STEEM
SBD Balance: 4.499 SBD
SP: 121.35205862624704
Delegated SP: 57.07437749836572
Total Posts: 261
Voting Power: 68.73%
pprint(yjcps.account_info)
{'active': {'account_auths': [],
'key_auths': [['STM52aJdPyehuxigiDfYngKBL8PSAcESNmYENdaVnwRuKoiP1M9eu',
1]],
'weight_threshold': 1},
'average_bandwidth': '56831815207',
'average_market_bandwidth': 1279817315,
'balance': '0.437 STEEM',
'can_vote': True,
'comment_count': 0,
'created': '2018-01-04T05:25:18',
'curation_rewards': 231,
'delegated_vesting_shares': '115562.393455 VESTS',
'guest_bloggers': [],
'id': 556829,
'json_metadata': '{"profile":{"name":"hacper","profile_image":"https://s.gravatar.com/avatar/6f1c379a4a2c2190a4aa0921836e98b1?s=80","location":"GuangDong, '
'China","about":"最好的选择莫过于投资自己,写作是其一!","website":"https://steemit.com/@yjcps","cover_image":"https://cdn.steemitimages.com/DQmTvZbcaXYAcpTAjyNLp4qa9ttMu2Eo5wHSSzTaQSK4tPj/%E5%9B%BE%E7%89%87.png","bitcoin":"123YPnYjJmANKtiBr4DTsGJcncxxu2q6y3","ethereum":"0x50be5c7e721b8e146167dccb35e3c94156e13f58"}}',
'last_account_recovery': '1970-01-01T00:00:00',
'last_account_update': '2018-08-10T02:42:45',
'last_bandwidth_update': '2018-08-19T02:06:15',
'last_market_bandwidth_update': '2018-08-16T01:42:00',
'last_owner_update': '2018-01-04T14:49:21',
'last_post': '2018-08-18T23:01:57',
'last_root_post': '2018-08-18T23:01:57',
'last_vote_time': '2018-08-19T02:06:15',
'lifetime_bandwidth': '615056000000',
'lifetime_market_bandwidth': '22160000000',
'lifetime_vote_count': 0,
'market_history': [],
'memo_key': 'STM6spBZkmNSe9fccLvsms7bGjSRaE4gsRbTAxNLnEiFHyhP9ww1f',
'mined': False,
'name': 'yjcps',
'next_vesting_withdrawal': '1969-12-31T23:59:59',
'other_history': [],
'owner': {'account_auths': [],
'key_auths': [['STM5gJExNnQn5aLjpp8cn7nngfYsutN6NCJmKfn9dFgji6fZrHkwH',
1]],
'weight_threshold': 1},
'post_count': 261,
'post_history': [],
'posting': {'account_auths': [['busy.app', 1],
['dlive.app', 1],
['dtube.app', 1],
['fundition.app', 1],
['partiko-steemcon', 1],
['smartsteem', 1],
['steemauto', 1],
['steemgg.app', 1],
['steemhunt.com', 1]],
'key_auths': [['STM8bbH2Sfq72PshhVeNpSRQAa4XeiDwTNq4LdY8hxFMZkhfSGZU9',
1]],
'weight_threshold': 1},
'posting_rewards': 54307,
'proxied_vsf_votes': [0, 0, 0, 0],
'proxy': '',
'received_vesting_shares': '0.000000 VESTS',
'recovery_account': 'skenan',
'reputation': '878683129879',
'reset_account': 'null',
'reward_sbd_balance': '0.000 SBD',
'reward_steem_balance': '0.000 STEEM',
'reward_vesting_balance': '0.000000 VESTS',
'reward_vesting_steem': '0.000 STEEM',
'savings_balance': '0.000 STEEM',
'savings_sbd_balance': '0.000 SBD',
'savings_sbd_last_interest_payment': '1970-01-01T00:00:00',
'savings_sbd_seconds': '0',
'savings_sbd_seconds_last_update': '1970-01-01T00:00:00',
'savings_withdraw_requests': 0,
'sbd_balance': '4.499 SBD',
'sbd_last_interest_payment': '2018-08-14T00:32:57',
'sbd_seconds': '1907954703',
'sbd_seconds_last_update': '2018-08-18T22:40:57',
'tags_usage': [],
'to_withdraw': 0,
'transfer_history': [],
'vesting_balance': '0.000 STEEM',
'vesting_shares': '245709.808613 VESTS',
'vesting_withdraw_rate': '0.000000 VESTS',
'vote_history': [],
'voting_power': 6873,
'withdraw_routes': 0,
'withdrawn': 0,
'witness_votes': ['abit',
'bobdos',
'ety001',
'justyy',
'skenan',
'therealwolf'],
'witnesses_voted_for': 6}
del yjcps
补充
解析日期字符串
# ISO format
dt = parser.parse("2018-01-04T14:49:21")
print(dt)
print(type(dt))
2018-01-04 14:49:21
<class 'datetime.datetime'>
# 设置时区
TZOFFSETS = {"BRST": -10800}
dt = parser.parse("Thu Sep 25 10:36:28 BRST 2003", tzinfos=TZOFFSETS)
print(dt)
print(type(dt))
2003-09-25 10:36:28-03:00
<class 'datetime.datetime'>
dt = parser.parse("2003-09-25T10:49:41.5-03:00")
print(dt)
2003-09-25 10:49:41.500000-03:00
dt = parser.parse("20030925T104941")
print(dt)
2003-09-25 10:49:41
dt = parser.parse("2003.Sep.25")
print(dt)
2003-09-25 00:00:00
dt = parser.parse("Tuesday, April 12, 1952 AD 3:30:42pm PST", ignoretz=True)
print(dt)
1952-04-12 15:30:42
时区转换
# 当前本地时间
print(datetime.now())
# 当前UTC时间
print(datetime.utcnow())
print()
# 时差
dt = datetime.now() - datetime.utcnow()
print(dt)
print()
# 设置时区为UTC+0:00
utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
print(utc_dt)
# 设置时区为UTC+8:00
_bj_dt = utc_dt.astimezone(timezone(dt))
print(_bj_dt)
# 设置时区为UTC+5:00
bj_dt = utc_dt.astimezone(timezone(timedelta(hours=5)))
print(bj_dt)
2018-08-19 11:35:33.051849
2018-08-19 03:35:33.051849
8:00:00
2018-08-19 03:35:33.052827+00:00
2018-08-19 11:35:33.052827+08:00
2018-08-19 08:35:33.052827+05:00
时间格式转换
dt = parser.parse("2018-08-18T23:01:57")
print(dt)
2018-08-18 23:01:57
# datetime 2 timestamp
timestamp = dt.timestamp()
print(timestamp)
print()
# timestamp 2 datetime
print(datetime.fromtimestamp(timestamp))
print(datetime.utcfromtimestamp(timestamp))
1534604517.0
2018-08-18 23:01:57
2018-08-18 15:01:57
# datetime 2 string
str_time = dt.strftime('%Y/%m/%d %H:%M:%S')
print(str_time)
print(type(str_time))
2018/08/18 23:01:57
<class 'str'>
[DA series - Learn Python with Steem]
[DA series - Learn Python with Steem #01] 安裝Python、文字編輯器與哈囉!
[DA series - Learn Python with Steem #08] 函式庫(Modules)的安裝與使用,準備好玩Steem!
[DA series - Learn Python with Steem #09] Steem 小工具DIY #1 - 我的Steem小偵探
[DA series - Learn Python with Steem #10] Steem 小工具DIY #2 - 我的文章列表(一)
我的笔记:
Leave Learn Python with Steem #09 笔记 to:
Read more #blog posts
Best Posts From hacper
We have not curated any of yjcps's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.