0

我试图了解 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∏„¢&gt;ˇ±ÿ‹pÁ1ÅSV∞}è«:¶¿fi™aÛd0hƒ◊{<m’2wÌÃüñ˙ÜÖg5∆~Çñ»Ô

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

4

1 回答 1

4

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

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

当然,这又完全不适用于BytesIO任何一个,因为它不是文件,而是其模拟。BytesIO(data)表现得像一个可读文件,其大小为 ;len(data)字节为data; 但是任何地方都没有实际的文件;使用BytesIOPython 只是模拟操作系统在它是这样的文件时的行为方式。因此.read(), 没有给定任何参数,总是返回从当前“文件”位置到“文件”末尾的所有数据,即 splice data[current_file_position:]

于 2015-02-28T07:42:48.377 回答