拆分大文件时清空块

时间:2017-01-02 17:35:03

标签: python

我正在尝试将大文件拆分为50Mb块并将其保存在其他文件中。在运行一些读/写操作后,我的一些块小于50Mb(43Mb,17Mb等等)。虽然,我在Java中编写了相同的代码并且它有同样的问题。怎么了?我的代码如下:

顺便说一句,我们可以做些什么来加速这段代码更快地拆分成块?

try:
    f = open(self.__filename, 'rb')
except (OSError, IOError), e:
    raise FileSplitterException, str(e)

bname = (os.path.split(self.__filename))[1]

fsize = os.path.getsize(self.__filename)

self.__chunksize = int(float(fsize)/float(self.__numchunks))

chunksz = self.__chunksize
total_bytes = 0

for x in range(self.__numchunks):
    chunkfilename = bname + '-' + str(x+1) + self.__postfix

    if x == self.__numchunks - 1:
        chunksz = fsize - total_bytes

    try:
        print 'Writing file',chunkfilename
        data = f.read(chunksz)
        total_bytes += len(data)
        chunkf = file(chunkfilename, 'wb')
        chunkf.write(data)
        chunkf.close()
    except (OSError, IOError), e:
        print e
        continue
    except EOFError, e:
        print e
        break

2 个答案:

答案 0 :(得分:0)

问题中的代码似乎集中在生成一定数量的块而不是50MB的文件。

此代码生成50MB文件。

import os


try:
    f = open('big.txt', 'rb')
except (OSError, IOError), e:
    raise FileSplitterException, str(e)

bname = (os.path.split('big.txt'))[1]

chunksz = 50 * 1000 * 1000 # metric MB - use 1024 * 1024 for binary MB (MiB)

counter = 0

while True:
    chunkfilename = bname + '-' + str(counter+1) + '.foo'

    try:
        print 'Writing file',chunkfilename
        data = f.read(chunksz)
        if not data:
            # We have reached the end of the file, end the script.
            break
        chunkf = file(chunkfilename, 'wb')
        chunkf.write(data)
        chunkf.close()
    except (OSError, IOError), e:
        print e
        continue
    except EOFError, e:
        print e
        break
    counter += 1

代码的某些方面在现代python中被认为是糟糕的风格 - 例如没有使用上下文管理器来打开文件 - 但是如果OP在像2.5这样的旧python上,我还没有改变它们。

答案 1 :(得分:0)

您的问题不清楚,因为您还没有包含Minimal, Complete, and Verifiable example - 所以我不知道完全您的代码有什么问题。然而,在创建/模拟我对缺失部分的猜测后,我能想出一些能完全符合你想要的东西,我认为。

<ul class="side-nav" id="mobile-sidenav">
  <li><a href="#">How It Works?</a></li>
  <li><a href="#">Technology</a></li>
  <li><a href="#">Pricing</a></li>
  <li><a href="#">More</a></li>
  <li><button class="waves-effect waves-light btn deep-orange">Request Demo</button></li>
</ul>
<div class="navbar-fixed">
  <nav class="">
    <div class="nav-wrapper red lighten-1">
      <div class="container-fluid">
        <a href="#!" class="brand-logo">
          <img src="img/logo.png">
        </a>
        <a href="#" data-activates="mobile-sidenav" class="button-collapse"><i class="material-icons">menu</i></a>
        <ul class="right hide-on-med-and-down">
          <li><a href="#">How It Works?</a></li>
          <li><a href="#">Technology</a></li>
          <li><a href="#">Pricing</a></li>
          <li><a href="#">More</a></li>
          <li><button class="waves-effect waves-light btn deep-orange">Request Demo</button></li>
        </ul>
      </div>
    </div>
  </nav>
</div>