2017-02-14 88 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