2017-02-14 61 views
0

我正在尝试将大文件缩小到给定文件大小以供测试。代码如下:在python中将给定的较大文件缩小到特定文件大小

f = open ('original_file', 'rb') 
f.seek(1000000) 
rest = f.read() 
f.close() 
f1 = open('new_file', 'w') 
f1.write(rest) 
f1.close() 

我想从该文件中减少1 MB而不考虑内容。但是我无法在同一个文件中获得这种减少。请帮助我在哪里出错或使用其他方法将相同文件的内容减少到指定的MB。谢谢。

回答

1

要将文件修剪到确定的大小,保持开始,您可以使用os.truncate调用。

你没有提到你是否想要在开头或文件末尾修剪字节 - 但是从你的代码中,推断它是在开始。

在这种情况下,由于通常的truncate调用在某些文件系统中可用来在最后剪切文件,所以需要做的是将数据从期望的位置写入到开始文件。这样做,仅仅是打开文件两次一种紧凑的方法 - (在某些操作系统可能无法正常工作,只读过DTA到一个临时对象,并再次打开该文件书面方式,在这种情况下):

import os 

def truncate_begining(path, length): 
    """Remove length bytes at the beggning of given file""" 
    original_length = os.stat(path).st_size 
    with open(path, "r+b") as reading, open(path, "r+b") as writting: 
     reading.seek(length) 
     writting.write(reading.read()) 
    try: 
     os.truncate(path, orginal_length - length) 
    except OSError as error: 
     print("Unable to truncate the file:", error) 

请注意,truncate功能在所有情况下都不可用,并且这取决于文件具有此功能的文件系统。如果它没有,则调用truncate会引发错误。 (该文件说电话是在Python 3.3新,并且仅适用于Windows上的Python 3.5起)

3.3

对于Python之前的版本,在Linux上,人们可以利用​​直接调用系统的截断:

import ctypes 
libc = ctypes.CDLL("libc.so.6") 
libc.truncate(<path>, <length>) 
+0

是否可用于python 2.7?谢谢。 – deep

+0

不,这是Python 3.3中的一个新东西 - 应该可以使用Python 2.7中的ctypes直接对O.S>进行系统调用。 但是,如果你有一个脚本来做到这一点(即使它做了很多事情),为什么不使用Python 3.6? – jsbueno

+0

当前框架支持Python 2.7。对这种安排做出改变将会很困难。谢谢 – deep