BytesIO.read() 如何检测文件结尾?

How does BytesIO.read() detect an end of file?

我正在尝试了解 BytesIO 的工作原理。

我正在尝试从 PDF 读取 PostScript 文件。当我将文件转换为字符串时,我正确地读取了所有内容,除了它的末尾是乱码。

dup 116 /t put
dup 117 /u put
dup 118 /v put
dup 119 /w put
dup 120 /x put
dup 121 /y put
dup 122 /z put
readonly def
currentdict end
currentfile eexec
Ÿ÷oc;Ñj≤Ѻ¯∞Aw-ÂŒ=”%ÂWò)-{ŸrΩu˙ï)ØúÇflrˆAï…¬‹„E(ı@⁄˝{Îπ¥á∫ìQª˚|¸_ëR—ª
ÿ–∆œ§ÎA≥≈ -T@Ê|˝q|VÅkπøJ%†qu8P¢¯wƒGx≥≈™€ÃÜ÷ÂQÊØ6K¸™“-çUå\Åß‘%°bù’"t-*x‘ıˆ”üœˇJë+
}Ïç3•{Z‡2颒z›¨T2s¿$Zı×&{BËñJ◊{®•flrÃó’ΩÕ·mî1lË(zÂNR¯rÈÚ^&%œ:(/Iãåfl∫Hímß!í4ù‹JflxIÚ7πbs,OíiˇOl7≥5R9¡˙ü≥zË(≤X*áRhï≥n√5áü≥&à£Âg«¸çfi\«c› ›µ∏9`EπΩÄ‚gú≤wÅÈ›T!…‹x»I‘ÒJz“àvÈ„*lÙcõo∆øÊÕsdm^ï%µµÇ=Ë∞∫ïüD+ã≥ùuˆ9πç#ïúö†π3µP«_]≤ÂÎ)õØËª≈w
¯à≈Í„™U™ˇAØ≠†8ú§  Hèé˘∑á·ÕuG–·:Dfiá·Jàé˛(Ü¢ÛW≠¬ÛÕæÛÔ]£-0<.™gSBNlîZûOêLÔ”°é5^9¥√˛:ßK∫*|ÓF
ÇÑˇ{√â ⁄áÄ™÷E,flû˚qº>Ωj0^óxÎñ≤Q≈˛'X√ÈÌÈÖâºi…;yZ…Pıt∏„¢>ˇ±ÿ‹pÁ1ÅSV∞}è«:¶¿fi™aÛd0hƒ◊{<m’2wÌÃüñ˙ÜÖg5∆~Çñ»Ô

当我在 Python 中执行 BytesIO.read() 时,它以某种方式知道有乱码并将其删除。 我的问题是它怎么知道的?是否有它寻找的文件结尾字符?如果有,那是什么?

是的,有些系统确实有文件结束字符。 MS-DOStext 文件中使用 ^Z (b'\x1a') 来表示文件结束。如果文件以二进制模式打开,情况就不会如此。在 UNIX 中,^D (b'\x04')(可在终端上用于表示从终端输入的文本的文件结尾;但是它不是写入文件的内容;没有结束标记。

EOF 或文件结尾 通常 只是一个条件,而不是任何魔法字符。操作系统知道每个文件有多大,并跟踪每个打开的文件被读取的位置。现在,如果某个文件的读取位置在 1000(从 0 开始)并且文件长度为 1000 字节,并且您尝试读取更多内容,操作系统会说 EOF而不是给你更多字节。

当然,这也完全不适用于 BytesIO,因为它不是一个文件,而是一个模拟文件。 BytesIO(data) 表现得像一个大小为 len(data) 且字节数为 data 的可读文件;但是任何地方都没有实际文件; with BytesIO Python 只是模拟了操作系统应该如何作为这样的文件。因此 .read(),如果没有参数,总是 returns 从当前 "file" 位置到 "file" 末尾的所有数据,即拼接 data[current_file_position:]