在python中将给定的较大文件减少到特定文件大小

时间:2017-02-14 03:17:37

标签: python filesystems

我正在尝试将较大的文件缩减为给定的文件大小以用于测试目的。代码如下:

Rivers  Km_inbetween    Group
Ohio         6            1
Ohio         7            1
Ohio         34           1
Ohio         17           1
Ohio         47           2
Ohio         5            2
Ohio         5            3
Ohio         3            3
Ohio         5            3
Ohio         19           3
Ohio         11           3
Ohio         12           3
Missouri     11           1
Missouri     10           1
Missouri     34           1
Missouri     19           2
Missouri     5            2
Missouri     19           2
Missouri     19           2

我想从该文件中减少1 MB而不管内容如何。但是我无法在同一个文件中获得减少。请帮助我出错的地方或任何其他方法将同一文件的内容减少到指定的MB。感谢。

1 个答案:

答案 0 :(得分:1)

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

您没有提及是否要在文件的开头或结尾处削减字节数 - 但是从您的代码中,可以推断它是在开始时。

在这种情况下,由于在某些文件系统中可以使用公共truncate调用来剪切文件,所以我们要做的就是将数据从所需位置写入到结尾处。开始调整文件。一个简单的方法是简单地打开文件两次 - (在一些可能不起作用的O.S.s中,只需将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中是新的,并且仅在Python 3.5之后可用于Windows)

对于3.3之前的Python版本,在Linux上,可以使用ctypes直接调用系统的截断:

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