python 2-7 如何实现用户的历史记录功能(最多n条)collections.deque/pickle持久存储

2-7 如何实现用户的历史记录功能(最多n条)collections.deque/pickle持久存储
使用collections deque,设定最大元素个数N,如果超过N,就会把最早进入队列的元素给挤掉
可以用pickle 对队列对象实现持久化存储,再次运行时候可以重新load

deque和pickle的用法

deque1 = deque([],5)
deque1.append(k)
f = open("save.data",'w')

pickle.dump(deque1, f)
deque1 = pickle.load(open("save.data"))  

一个真实的例子

比如一个例子就是竞猜答案,我们可以把用户最近5次的猜的数字保留下来,多于5次的,就会把最早一次的挤出队列
同样程序如果重新启动时候也还要把历史数据给重新load进来,程序重新启动时候读到历史数据

from collections import deque
import pickle
from random import randint
import os
result = randint(1,100)

print "result is ",result
deque1 = deque([],5)

if os.path.isfile("save.data"):
    deque1 = pickle.load(open("save.data"))    


while True:
    k = raw_input("\nplease input your guess number: ")

    if k.isdigit():
       k = int(k)
    elif k == 'h' or k == 'H':
        print "your input history is ",list(deque1)

    else:
        continue  

    if k != result:
        if k > result:
            print "your number is greater than result\n"            
        else:
            print "your number is less than result\n"       
        deque1.append(k)

    else:
        print "It was good result..."
        deque1.append(k)
        break


f = open("save.data",'w')

pickle.dump(deque1, f)

deque的帮助信息

>>> help(collections.deque)
Help on class deque in module collections:

class deque(__builtin__.object)
 |  deque(iterable[, maxlen]) --> deque object
 |  
 |  Build an ordered collection with optimized access from its endpoints.
 |  
 |  Methods defined here:
 |  
 |  __copy__(...)
 |      Return a shallow copy of a deque.
 |  
 |  __delitem__(...)
 |      x.__delitem__(y) <==> del x[y]
 |  
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |  
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __gt__(...)
 |      x.__gt__(y) <==> x>y
 |  
 |  __iadd__(...)
 |      x.__iadd__(y) <==> x+=y
 |  
 |  __init__(...)
 |      x.__init__(...) initializes x; see help(type(x)) for signature
 |  
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |  
 |  __le__(...)
 |      x.__le__(y) <==> x<=y
 |  
 |  __len__(...)
 |      x.__len__() <==> len(x)
 |  
 |  __lt__(...)
 |      x.__lt__(y) <==> x...)
 |      x.__ne__(y) <==> x!=y
 |  
 |  __reduce__(...)
 |      Return state information for pickling.
 |  
 |  __repr__(...)
 |      x.__repr__() <==> repr(x)
 |  
 |  __reversed__(...)
 |      D.__reversed__() -- return a reverse iterator over the deque
 |  
 |  __setitem__(...)
 |      x.__setitem__(i, y) <==> x[i]=y
 |  
 |  append(...)
 |      Add an element to the right side of the deque.
 |  
 |  appendleft(...)
 |      Add an element to the left side of the deque.
 |  
 |  clear(...)
 |      Remove all elements from the deque.
 |  
 |  count(...)
 |      D.count(value) -> integer -- return number of occurrences of value
 |  
 |  extend(...)
 |      Extend the right side of the deque with elements from the iterable
 |  
 |  extendleft(...)
 |      Extend the left side of the deque with elements from the iterable
 |  
 |  pop(...)
 |      Remove and return the rightmost element.
 |  
 |  popleft(...)
 |      Remove and return the leftmost element.
 |  
 |  remove(...)
 |      D.remove(value) -- remove first occurrence of value.
 |  
 |  reverse(...)
 |      D.reverse() -- reverse *IN PLACE*
 |  
 |  rotate(...)
 |      Rotate the deque n steps to the right (default n=1).  If n is negative, rotates left.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  maxlen
 |      maximum size of a deque or None if unbounded
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __hash__ = None
 |  
 |  __new__ = in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T

pickle的帮助信息

>>> help(pickle)
Help on module pickle:

NAME
    pickle - Create portable serialized representations of Python objects.

FILE
    /opt/swe/tools/ext/gnu/python-2.7.3/lib/python2.7/pickle.py

DESCRIPTION
    See module cPickle for a (much) faster implementation.
    See module copy_reg for a mechanism for registering custom picklers.
    See module pickletools source for extensive comments.

    Classes:

        Pickler
        Unpickler

    Functions:

        dump(object, file)
        dumps(object) -> string
        load(file) -> object
        loads(string) -> object

    Misc variables:

        __version__
        format_version
        compatible_formats

CLASSES
    exceptions.Exception(exceptions.BaseException)
        PickleError
            PicklingError
            UnpicklingError
    Pickler
    Unpickler

    Functions:

        dump(object, file)
        dumps(object) -> string
        load(file) -> object
        loads(string) -> object

    Misc variables:

        __version__
        format_version
        compatible_formats

CLASSES
    exceptions.Exception(exceptions.BaseException)
        PickleError
            PicklingError
            UnpicklingError
    Pickler
    Unpickler

    class PickleError(exceptions.Exception)
     |  A common base class for the other pickling exceptions.
     |  
     |  Method resolution order:
     |      PickleError
     |      exceptions.Exception
     |      exceptions.BaseException
     |      __builtin__.object
     |  
     |  Data descriptors defined here:
     |  
     |  __weakref__
     |      list of weak references to the object (if defined)
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.Exception:
     |  
     |  __init__(...)
     |      x.__init__(...) initializes x; see help(type(x)) for signature
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes inherited from exceptions.Exception:
     |  
     |  __new__ = 
     |      T.__new__(S, ...) -> a new object with type S, a subtype of T
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.BaseException:
     |  
     |  __delattr__(...)
     |      x.__delattr__('name') <==> del x.name
     |  
     |  __getattribute__(...)
     |      x.__getattribute__('name') <==> x.name
     |  
     |  __getitem__(...)
     |      x.__getitem__(y) <==> x[y]
     |  
     |  __getslice__(...)
     |      x.__getslice__(i, j) <==> x[i:j]
     |      
     |      Use of negative indices is not supported.
     |  
     |  __reduce__(...)
     |  
     |  __repr__(...)
     |      x.__repr__() <==> repr(x)
     |  
     |  __setattr__(...)
     |      x.__setattr__('name', value) <==> x.name = value
     |  
     |  __setstate__(...)
     |  
     |  __str__(...)
     |      x.__str__() <==> str(x)
     |  
     |  __unicode__(...)
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors inherited from exceptions.BaseException:
     |  
     |  __dict__
     |  
     |  args
     |  
     |  message

    class Pickler
     |  Methods defined here:
     |  
     |  __init__(self, file, protocol=None)
     |      This takes a file-like object for writing a pickle data stream.
     |      
     |      The optional protocol argument tells the pickler to use the
     |      given protocol; supported protocols are 0, 1, 2.  The default
     |      protocol is 0, to be backwards compatible.  (Protocol 0 is the
     |      only protocol that can be written to a file opened in text
     |      mode and read back successfully.  When using a protocol higher
     |      than 0, make sure the file is opened in binary mode, both when
     |      pickling and unpickling.)
     |      
     |      Protocol 1 is more efficient than protocol 0; protocol 2 is
     |      more efficient than protocol 1.
     |      
     |      Specifying a negative protocol version selects the highest
     |      protocol version supported.  The higher the protocol used, the
     |      more recent the version of Python needed to read the pickle
     |      produced.
     |      
     |      The file parameter must have a write() method that accepts a single
     |      string argument.  It can thus be an open file object, a StringIO
     |      object, or any other custom object that meets this interface.
     |  
     |  clear_memo(self)
     |      Clears the pickler's "memo".
     |      
     |      The memo is the data structure that remembers which objects the
     |      pickler has already seen, so that shared or recursive objects are
     |      pickled by reference and not by value.  This method is useful when
     |      re-using picklers.
     |  
     |  dump(self, obj)
     |      Write a pickled representation of obj to the open file.
     |  
     |  get(self, i, pack=)
     |      # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
     |  
     |  memoize(self, obj)
     |      Store an object in the memo.
     |  
     |  persistent_id(self, obj)
     |  
     |  put(self, i, pack=)
     |      # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
     |  
     |  save(self, obj)
     |  
     |  save_bool(self, obj)
     |  
     |  save_dict(self, obj)
     |  
     |  save_empty_tuple(self, obj)
     |      # save_empty_tuple() isn't used by anything in Python 2.3.  However, I
     |      # found a Pickler subclass in Zope3 that calls it, so it's not harmless
     |      # to remove it.
     |  
     |  save_float(self, obj, pack=)
     |  
     |  save_global(self, obj, name=None, pack=)
     |  
     |  save_inst(self, obj)
     |  
     |  save_int(self, obj, pack=)
     |  
     |  save_list(self, obj)
     |  
     |  save_long(self, obj, pack=)
     |  
     |  save_none(self, obj)
     |  
     |  save_pers(self, pid)
     |  
     |  save_reduce(self, func, args, state=None, listitems=None, dictitems=None, obj=None)
     |  
     |  save_string(self, obj, pack=)
     |  
     |  save_tuple(self, obj)
     |  
     |  save_unicode(self, obj, pack=)
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  
     |  dispatch = {: , 

    class PicklingError(PickleError)
     |  This exception is raised when an unpicklable object is passed to the
     |  dump() method.
     |  
     |  Method resolution order:
     |      PicklingError
     |      PickleError
     |      exceptions.Exception
     |      exceptions.BaseException
     |      __builtin__.object
     |  
     |  Data descriptors inherited from PickleError:
     |  
     |  __weakref__
     |      list of weak references to the object (if defined)
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.Exception:
     |  
     |  __init__(...)
     |      x.__init__(...) initializes x; see help(type(x)) for signature
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes inherited from exceptions.Exception:
     |  
     |  __new__ = 
     |      T.__new__(S, ...) -> a new object with type S, a subtype of T
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.BaseException:
     |  
     |  __delattr__(...)
     |      x.__delattr__('name') <==> del x.name
     |  
     |  __getattribute__(...)
     |      x.__getattribute__('name') <==> x.name
     |  
     |  __getitem__(...)
     |      x.__getitem__(y) <==> x[y]
     |  
     |  __getslice__(...)
     |      x.__getslice__(i, j) <==> x[i:j]
     |      
     |      Use of negative indices is not supported.
     |  
     |  __reduce__(...)
     |  
     |  __repr__(...)
     |      x.__repr__() <==> repr(x)
     |  
     |  __setattr__(...)
     |      x.__setattr__('name', value) <==> x.name = value
     |  
     |  __setstate__(...)
     |  
     |  __str__(...)
     |      x.__str__() <==> str(x)
     |  
     |  __unicode__(...)
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors inherited from exceptions.BaseException:
     |  
     |  __dict__
     |  
     |  args
     |  
     |  message

    class Unpickler
     |  Methods defined here:
     |  
     |  __init__(self, file)
     |      This takes a file-like object for reading a pickle data stream.
     |      
     |      The protocol version of the pickle is detected automatically, so no
     |      proto argument is needed.
     |      
     |      The file-like object must have two methods, a read() method that
     |      takes an integer argument, and a readline() method that requires no
     |      arguments.  Both methods should return a string.  Thus file-like
     |      object can be a file object opened for reading, a StringIO object,
     |      or any other custom object that meets this interface.
     |  
     |  find_class(self, module, name)
     |  
     |  get_extension(self, code)
     |  
     |  load(self)
     |      Read a pickled object representation from the open file.
     |      
     |      Return the reconstituted object hierarchy specified in the file.
     |  
     |  load_append(self)
     |  
     |  load_appends(self)
     |  
     |  load_binfloat(self, unpack=)
     |  
     |  load_binget(self)
     |  
     |  load_binint(self)
     |  
     |  load_binint1(self)
     |  
     |  load_binint2(self)
     |  
     |  load_binpersid(self)
     |  
     |  load_binput(self)
     |  
     |  load_binstring(self)
     |  
     |  load_binunicode(self)
     |  
     |  load_build(self)
     |  
     |  load_dict(self)
     |  
     |  load_dup(self)
     |  
     |  load_empty_dictionary(self)
     |  
     |  load_empty_list(self)
     |  
     |  load_empty_tuple(self)
     |  
     |  load_eof(self)
     |  
     |  load_ext1(self)
     |  
     |  load_ext2(self)
     |  
     |  load_ext4(self)
     |  
     |  load_false(self)
     |  
     |  load_float(self)
     |  
     |  load_get(self)
     |  
     |  load_global(self)
     |  
     |  load_inst(self)
     |  
     |  load_int(self)
     |  
     |  load_list(self)
     |  
     |  load_long(self)
     |  
     |  load_long1(self)
     |  
     |  load_long4(self)
     |  
     |  load_long_binget(self)
     |  
     |  load_long_binput(self)
     |  
     |  load_mark(self)
     |  
     |  load_newobj(self)
     |  
     |  load_none(self)
     |  
     |  load_obj(self)
     |  
     |  load_persid(self)
     |  
     |  load_pop(self)
     |  
     |  load_pop_mark(self)
     |  
     |  load_proto(self)
     |  
     |  load_put(self)
     |  
     |  load_reduce(self)
     |  
     |  load_setitem(self)
     |  
     |  load_setitems(self)
     |  
     |  load_short_binstring(self)
     |  
     |  load_stop(self)
     |  
     |  load_string(self)
     |  
     |  load_true(self)
     |  
     |  load_tuple(self)
     |  
     |  load_tuple1(self)
     |  
     |  load_tuple2(self)
     |  
     |  load_tuple3(self)
     |  
     |  load_unicode(self)
     |  
     |  marker(self)
     |      # Return largest index k such that self.stack[k] is self.mark.
     |      # If the stack doesn't contain a mark, eventually raises IndexError.
     |      # This could be sped by maintaining another stack, of indices at which
     |      # the mark appears.  For that matter, the latter stack would suffice,
     |      # and we wouldn't need to push mark objects on self.stack at all.
     |      # Doing so is probably a good thing, though, since if the pickle is
     |      # corrupt (or hostile) we may get a clue from finding self.mark embedded
     |      # in unpickled objects.
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes defined here:
     |  
     |  dispatch = {'': , '(': , ')': <...

    class UnpicklingError(PickleError)
     |  This exception is raised when there is a problem unpickling an object,
     |  such as a security violation.
     |  
     |  Note that other exceptions may also be raised during unpickling, including
     |  (but not necessarily limited to) AttributeError, EOFError, ImportError,
     |  and IndexError.
     |  
     |  Method resolution order:
     |      UnpicklingError
     |      PickleError
     |      exceptions.Exception
     |      exceptions.BaseException
     |      __builtin__.object
     |  
     |  Data descriptors inherited from PickleError:
     |  
     |  __weakref__
     |      list of weak references to the object (if defined)
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.Exception:
     |  
     |  __init__(...)
     |      x.__init__(...) initializes x; see help(type(x)) for signature
     |  
     |  ----------------------------------------------------------------------
     |  Data and other attributes inherited from exceptions.Exception:
     |  
     |  __new__ = 
     |      T.__new__(S, ...) -> a new object with type S, a subtype of T
     |  
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.BaseException:
     |  
     |  __delattr__(...)
     |      x.__delattr__('name') <==> del x.name
     |  
     |  __getattribute__(...)
     |      x.__getattribute__('name') <==> x.name
     |  
     |  __getitem__(...)
     |      x.__getitem__(y) <==> x[y]
     |  
     |  __getslice__(...)
     |      x.__getslice__(i, j) <==> x[i:j]
     |      
     |      Use of negative indices is not supported.
     |  
     |  __reduce__(...)
     |  
     |  __repr__(...)
     |      x.__repr__() <==> repr(x)
     |  
     |  __setattr__(...)
     |      x.__setattr__('name', value) <==> x.name = value
     |  
     |  __setstate__(...)
     |  
     |  __str__(...)
     |      x.__str__() <==> str(x)
     |  
     |  __unicode__(...)
     |  
     |  ----------------------------------------------------------------------
     |  Data descriptors inherited from exceptions.BaseException:
     |  
     |  __dict__
     |  
     |  args
     |  
     |  message

FUNCTIONS
    dump(obj, file, protocol=None)

    dumps(obj, protocol=None)

    load(file)

    loads(str)

DATA
    APPEND = 'a'
    APPENDS = 'e'
    BINFLOAT = 'G'
    BINGET = 'h'
    BININT = 'J'
    BININT1 = 'K'
    BININT2 = 'M'
    BINPERSID = 'Q'
    BINPUT = 'q'
    BINSTRING = 'T'
    BINUNICODE = 'X'
    BUILD = 'b'
    DICT = 'd'
    DUP = '2'
    EMPTY_DICT = '}'
    EMPTY_LIST = ']'
    EMPTY_TUPLE = ')'
    EXT1 = '\x82'
    EXT2 = '\x83'
    EXT4 = '\x84'
    FALSE = 'I00\n'
    FLOAT = 'F'
    GET = 'g'
    GLOBAL = 'c'
    HIGHEST_PROTOCOL = 2
    INST = 'i'
    INT = 'I'
    LIST = 'l'
    LONG = 'L'
    LONG1 = '\x8a'
    LONG4 = '\x8b'
    LONG_BINGET = 'j'
    LONG_BINPUT = 'r'
    MARK = '('
    NEWFALSE = '\x89'
    NEWOBJ = '\x81'
    NEWTRUE = '\x88'
    NONE = 'N'
    OBJ = 'o'
    PERSID = 'P'
    POP = '0'
    POP_MARK = '1'
    PROTO = '\x80'
    PUT = 'p'
    REDUCE = 'R'
    SETITEM = 's'
    SETITEMS = 'u'
    SHORT_BINSTRING = 'U'
    STOP = '.'
    STRING = 'S'
    TRUE = 'I01\n'
    TUPLE = 't'
    TUPLE1 = '\x85'
    TUPLE2 = '\x86'
    TUPLE3 = '\x87'
    UNICODE = 'V'
    __all__ = ['PickleError', 'PicklingError', 'UnpicklingError', 'Pickler...
    __version__ = '$Revision: 72223 $'

VERSION
    72223

你可能感兴趣的:(python实战)