代码之家  ›  专栏  ›  技术社区  ›  Alex Amato

写文件时如何限制文件大小?

  •  10
  • Alex Amato  · 技术社区  · 15 年前

    我正在使用IO模块的输出流并写入文件。我希望能够检测到何时我已经将1g数据写入了一个文件,然后开始写入第二个文件。我似乎不知道如何确定我已写入文件的数据量。

    有什么容易内置的吗 io ?或者我可能需要在每次手动写入之前计算字节数?

    6 回复  |  直到 8 年前
        1
  •  9
  •   Mark Tolonen    15 年前

    File Objects tell

    >>> f=open('test.txt','w')
    >>> f.write(10*'a')
    >>> f.tell()
    10L
    >>> f.write(100*'a')
    >>> f.tell()
    110L
    
        2
  •  14
  •   Tom Wainwright    12 年前

    RotatingFileHandler

    import logging
    import logging.handlers
    
    file_name = 'test.log'
    
    test_logger = logging.getLogger('Test')
    handler = logging.handlers.RotatingFileHandler(file_name, maxBytes=10**9)
    test_logger.addHandler(handler)
    

        3
  •  3
  •   janneb    15 年前

        4
  •  2
  •   martineau    12 年前

    file

    '\n' '\r\n' bufsize file() open()

    import os.path
    verbose = False
    
    class LtdSizeFile(file):
        ''' A file subclass which  limits size of file written to approximately "maxsize" bytes '''
        def __init__(self, filename, mode='wt', maxsize=None):
            self.root, self.ext = os.path.splitext(filename)
            self.num = 1
            self.size = 0
            if maxsize is not None and maxsize < 1:
                raise ValueError('"maxsize: argument should be a positive number')
            self.maxsize = maxsize
            file.__init__(self, self._getfilename(), mode)
            if verbose: print 'file "%s" opened' % self._getfilename()
    
        def close(self):
            file.close(self)
            self.size = 0
            if verbose: print 'file "%s" closed' % self._getfilename()
    
        def write(self, text):
            lentext =len(text)
            if self.maxsize is None or self.size+lentext <= self.maxsize:
                file.write(self, text)
                self.size += lentext
            else:
                self.close()
                self.num += 1
                file.__init__(self, self._getfilename(), self.mode)
                if verbose: print 'file "%s" opened' % self._getfilename()
                self.num += 1
                file.write(self, text)
                self.size += lentext
    
        def writelines(self, lines):
            for line in lines:
                self.write(line)
    
        def _getfilename(self):
            return '{0}{1}{2}'.format(self.root, self.num if self.num > 1 else '', self.ext)
    
    if __name__=='__main__':
        import random
        import string
    
        def randomword():
            letters = []
            for i in range(random.randrange(2,7)):
                letters.append(random.choice(string.lowercase))
            return ''.join(letters)
    
        def randomsentence():
            words = []
            for i in range(random.randrange(2,10)):
                words.append(randomword())
            words[0] = words[0].capitalize()
            words[-1] = ''.join([words[-1], '.\n'])
            return ' '.join(words)
    
        lsfile = LtdSizeFile('LtdSizeTest.txt', 'wt', 100)
        for i in range(100):
            sentence = randomsentence()
            if verbose: print '  writing: {!r}'.format(sentence)
            lsfile.write(sentence)
    
        lsfile.close()
    
        5
  •  1
  •   Corbin    15 年前

    tell() if tell() > 1024*1024*1024:

    if len(data_to_write) + tell > 1024*1024*1024:

        6
  •  0
  •   Jeff Ferland    15 年前

    tell()

    #pseudocode
    if (written + sizeOfNew > 1G) {
        rotateFile()
    }