Random filenames

Posted on 23 Jul 2007. in development python ruby

In Python:

    import os.path, random, string
    def random_filename(chars=string.hexchars, length=16, prefix='',
                        suffix='', verify=True, attempts=10):
        for attempt in range(attempts):
            filename = ''.join([random.choice(chars) for i in range(length)])
            filename = prefix + filename + suffix
            if not verify or not os.path.exists(filename):
                return filename

    >>> random_filename()
    'DC53e02B08eF47e9'
    >>> random_filename(chars='hi', length=32)
    'hhhihihhhiiihhhihhiiiiiihhhhiihh'
    >>> random_filename(prefix='username', suffix='.txt')
    'username7dbd29aBdD25BeB9.txt'

    # returns None if it can't find a filename
    >>> open('xxx', 'w').close()
    >>> str(random_filename(chars='x', length=3))
    'None'

In Ruby:

    def random_filename(opts={})
        opts = {:chars => ('0'..'9').to_a + ('A'..'F').to_a + ('a'..'f').to_a,
                :length => 16, :prefix => '', :suffix => '',
                :verify => true, :attempts => 10}.merge(opts)
        opts[:attempts].times do
            filename = ''
            opts[:length].times do
                filename << opts[:chars][rand(opts[:chars].size)]
            end
            filename = opts[:prefix] + filename + opts[:suffix]
            return filename unless opts[:verify] && File.exists?(filename)
        end
        nil
    end