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

时间:2015-02-28 04:58:33

标签: python string bytesio

我正在努力了解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()时,它会以某种方式知道存在胡言乱语并将其删除。 我的问题是它是如何知道的?它找到了文件结尾字符吗?如果是这样的话是什么?

1 个答案:

答案 0 :(得分:4)

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

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

当然,这当然也不适用于BytesIO,因为它不是文件,而是模拟它。 BytesIO(data)的行为类似于可读文件,其大小为len(data),其字节为data;但是在任何地方都没有实际的文件;使用BytesIO Python可以模拟操作系统在其类似文件时的行为方式。因此,.read(),在没有参数的情况下,总会将当前“文件”位置的所有数据返回到“文件”的末尾,即拼接data[current_file_position:]