Learn Python with Steem #09 笔记


[toc]

划重点

  • 遍历字典 利用dict.items()方法,用一个循环语句遍历整个字典的所有元素。

  • 转换 Reputation 和 Voting Power 的原始数据

    直接获取的某些数据是生的,需要煮(转换)一下才能吃。

  • 解析时间

    使用Python的dateutil和datetime模块来解析和处理时间数据。

编程练习

1
2
3
4
5
6
7
8
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
1
2
yjcps = Steemains('yjcps')
pprint(yjcps.view_account_info)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{'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}
1
2
3
deanliu = Steemains('deanliu')
pprint(deanliu.view_account_info)
del deanliu
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{'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}
1
2
3
dapeng = Steemains('dapeng')
pprint(dapeng.view_account_info)
del dapeng
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{'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}
1
2
for key,value in yjcps.view_account_info.items():
    print(key,':',value)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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%
1
pprint(yjcps.account_info)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{'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}
1
del yjcps

补充

解析日期字符串

python-dateutil

1
2
3
4
# ISO format
dt = parser.parse("2018-01-04T14:49:21")
print(dt)
print(type(dt))
1
2
2018-01-04 14:49:21
<class 'datetime.datetime'>
1
2
3
4
5
# 设置时区
TZOFFSETS = {"BRST": -10800}
dt = parser.parse("Thu Sep 25 10:36:28 BRST 2003",  tzinfos=TZOFFSETS)
print(dt)
print(type(dt))
1
2
2003-09-25 10:36:28-03:00
<class 'datetime.datetime'>
1
2
dt = parser.parse("2003-09-25T10:49:41.5-03:00")
print(dt)
1
2003-09-25 10:49:41.500000-03:00
1
2
dt = parser.parse("20030925T104941")
print(dt)
1
2003-09-25 10:49:41
1
2
dt = parser.parse("2003.Sep.25")
print(dt)
1
2003-09-25 00:00:00
1
2
dt = parser.parse("Tuesday, April 12, 1952 AD 3:30:42pm PST", ignoretz=True)
print(dt)
1
1952-04-12 15:30:42

时区转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 当前本地时间
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)
1
2
3
4
5
6
7
8
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

时间格式转换

1
2
dt = parser.parse("2018-08-18T23:01:57")
print(dt)
1
2018-08-18 23:01:57
1
2
3
4
5
6
7
8
9
# datetime 2 timestamp
timestamp = dt.timestamp()
print(timestamp)

print()

# timestamp 2 datetime
print(datetime.fromtimestamp(timestamp))
print(datetime.utcfromtimestamp(timestamp))
1
2
3
4
1534604517.0

2018-08-18 23:01:57
2018-08-18 15:01:57
1
2
3
4
# datetime 2 string
str_time = dt.strftime('%Y/%m/%d %H:%M:%S')
print(str_time)
print(type(str_time))
1
2
2018/08/18 23:01:57
<class 'str'>

[DA series - Learn Python with Steem]

我的笔记: