我正在尝试将较大的文件缩减为给定的文件大小以用于测试目的。代码如下:
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。感谢。
答案 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>)