Чтение и возврат до размера байтов. Если аргумент опущен, None или
отрицательно, данные считываются и возвращаются до достижения EOF. Пустой
Объект bytes возвращается, если поток уже находится в EOF.
Если аргумент положительный, а основной исходный поток не
интерактивное, несколько необработанных чтений могут быть выполнены для удовлетворения байта
рассчитывать (если EOF не достигнут первым). Но для интерактивных потоков,
будет выдано не более одного необработанного чтения, , и короткий результат не означает
что EOF неизбежен.
BlockingIOError вызывается, если основной исходный поток находится в
режим блокировки, и в данный момент нет доступных данных.
io.BufferedIOBase.read
Если результат, возвращаемый операцией чтения, может иметь длину меньше заданной или ожидаемой суммы; и до сих пор не предполагают, что EOF был достигнут, какой надежный способ разделения будет наиболее надежным?
import os
import io
def reliable_read(file_obj, amount=None, chk_size=2):
file_size = os.fstat(file_obj.file_no()).st_size
data = b"" if isinstance(file_obj, io.BufferedReader) else ""
amount_read = 0
if amount is None:
amount = file_size
while amount_read < amount:
data += file_obj.read(chk_size)
return data
Первоначально я думал, что по какой-то причине, чем меньше размер фрагмента, тем выше вероятность того, что чтение будет выполнено полностью; однако я точно не знаю, так ли это, поэтому он проверяет надежность вышеуказанной функции.
Это также неэффективно, так как chk_size
приближается к 1, количество вызовов функций приближается к file_size
, что не оптимально для действительно больших файлов.
По сути, без использования CFFI для импорта fopen
, fread
и fclose
- какая встроенная функция или библиотека существует, которая обеспечивает надежное чтение, также в сущности моего названия; функция, которая возвращает точное прочитанное количество, либо помещая буфер чтения в список по ссылке, либо в виде кортежа (data, n_read)
.