Advertisement
anacrolix

buncode

Jul 5th, 2011
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.14 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import collections
  4. import os
  5. import pdb
  6. import pprint
  7. import sys
  8.  
  9. def buncode(f):
  10.     while True:
  11.         c = f.read(1).decode()
  12.         if not c:
  13.             return
  14.         if c == 'd':
  15.             a = iter(buncode(f))
  16.             yield collections.OrderedDict(zip(map(bytes.decode, a), a))
  17.         elif c == 'i':
  18.             i = ''
  19.             while True:
  20.                 c = f.read(1).decode()
  21.                 if not c:
  22.                     return
  23.                 if c == 'e':
  24.                     yield int(i)
  25.                     break
  26.                 else:
  27.                     i += c
  28.         elif c == 'l':
  29.             yield list(buncode(f))
  30.         elif c == 'e':
  31.             return
  32.         else:
  33.             i = c
  34.             while True:
  35.                 c = f.read(1).decode()
  36.                 assert c, i
  37.                 if c == ':':
  38.                     yield f.read(int(i))
  39.                     break
  40.                 else:
  41.                     i += c
  42.  
  43. if len(sys.argv) == 2:
  44.     f = open(sys.argv[1], 'rb')
  45. else:
  46.     f = os.fdopen(sys.stdin.fileno(), 'rb')
  47. pprint.pprint(buncode(f).__next__())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement