Randomly selecting lines from files

后端 未结 7 674
轮回少年
轮回少年 2021-01-13 14:21

I have bunch of files and very file has a header of 5 lines. In the rest of the file, pair of line form an entry. I need to randomly select entry from these files. How can

7条回答
  •  隐瞒了意图╮
    2021-01-13 15:07

    Python solution - reads file only once and requires little memory

    Invoke like so getRandomItems(file('myHuge.log'), 5, 2) - will return list of 2 lines

    from random import randrange
    
    def getRandomItems(f, skipFirst=0, numItems=1):
        for _ in xrange(skipFirst):
            f.next()
        n = 0; r = []
        while True:
            try:
                nxt = [f.next() for _ in range(numItems)]
            except StopIteration: break
            n += 1
            if not randrange(n):
                r = nxt
        return r
    

    Returns empty list if it could not get the first passable items from f. The code's only requirement is that argument f is an iterator (supports next() method). Hence we can pass something different than file, say we want to see the distribution:

    >>> s={}
    >>> for i in xrange(5000):
    ...     r = getRandomItems(iter(xrange(50)))[0]
    ...     s[r] = 1 + s.get(r,0)
    ... 
    >>> for i in s: 
    ...     print i, '*' * s[i]
    ... 
    0 ***********************************************************************************************
    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 ****************************************************************************************************************
    

提交回复
热议问题