![](/img/trans.png)
[英]When reading a socket in python, is there any difference between os.read and socket.recv?
[英]python os.read() not reading correct number of bytes
我正在嘗試從二進制文件(oracle 重做日志)中讀取塊,但我遇到了一個問題,當我嘗試使用 os.read(fd,512) 讀取 512 字節塊時,返回的字節數少於 512 字節. (金額因區塊而異)
文檔指出“最多 n 字節”,所以我得到的比預期的少是有道理的。 如何強制它繼續讀取,直到我得到正確數量的字節?
我試圖調整這里描述的方法Python f.read 沒有讀取正確的字節數但我仍然有問題
def read_exactly(fd, size):
data = b''
remaining = size
while remaining: # or simply "while remaining", if you'd like
newdata = read(fd, remaining)
if len(newdata) == 0: # problem
raise IOError("Failed to read enough data")
data += newdata
remaining -= len(newdata)
return data
def get_one_block(fd, start, blocksize):
lseek(fd, start, 0)
blocksize = blocksize
print('Blocksize: ' + str(blocksize))
block = read_exactly(fd, blocksize)
print('Actual Blocksize: ' + str(block.__sizeof__()))
return block
然后返回錯誤: OSError: Failed to read enough data
我的代碼:
from os import open, close, O_RDONLY, lseek, read, write, O_BINARY, O_CREAT, O_RDWR
def get_one_block(fd, start, blocksize):
lseek(fd, start, 0)
blocksize = blocksize
print('Blocksize: ' + str(blocksize))
block = read(fd, blocksize)
print('Actual Blocksize: ' + str(block.__sizeof__()))
return block
def main():
filename = "redo_logs/redo03.log"
fd = open(filename, O_RDONLY, O_BINARY)
b = get_one_block(fd, 512, 512)
Output
Blocksize: 512
Actual Blocksize: 502
在這種情況下,讀取的最后一個字節是 0xB3,后面是 0x1A,我認為這是問題所在。
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
EF 42 B8 5A DC D1 63 1B A3 31 C7 5E 9F 4A B7 F4
4E 04 6B E8 B3<<-- stops here -->>1A 4F 3C BF C9 3C F6 9F C3 08 02
05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
任何幫助將不勝感激:)
您需要在 while 循環中讀取並檢查您擁有的真實字節數。
如果你得到的更少,你會用左邊的增量再次閱讀。
當您得到預期或達到 EOF 時,while 退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.