簡體   English   中英

python os.read() 未讀取正確的字節數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM