IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Learn Python with Steem #09 笔记

    Hacper\'s Blog发表于 2018-08-20 06:00:24
    love 0

    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]

    • [DA series - Learn Python with Steem #01] 安裝Python、文字編輯器與哈囉!
    • [DA series - Learn Python with Steem #02] 變數與資料型態
    • [DA series - Learn Python with Steem #03] 邏輯判斷
    • [DA series - Learn Python with Steem #04] 迴圈
    • [DA series – Learn Python with Steem #05] 基本資料結構
    • [DA series - Learn Python with Steem #06] 函式
    • [DA series - Learn Python with Steem #07] 類別
    • [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 - 我的文章列表(一)

    我的笔记:

    • Learn Python with Steem #01 笔记
    • Learn Python with Steem #02 笔记
    • Learn Python with Steem #03 笔记
    • Learn Python with Steem #04 笔记
    • Learn Python with Steem #05 笔记
    • Learn Python with Steem #06 笔记
    • Learn Python with Steem #07 笔记
    • Learn Python with Steem #08 笔记


沪ICP备19023445号-2号
友情链接