我正在努力了解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()
时,它会以某种方式知道存在胡言乱语并将其删除。
我的问题是它是如何知道的?它找到了文件结尾字符吗?如果是这样的话是什么?
答案 0 :(得分:4)
是的,某些系统确实具有文件结束字符。 MS-DOS 使用 text 文件中的^Z
(b'\x1a'
)来表示文件结尾。如果文件是以二进制模式打开的,则情况并非如此。在UNIX中,^D
(b'\x04'
)(可以在终端上用于表示从终端输入的文本的文件结尾;但是它不是写入文件的内容;没有结束标记。
而不是任何魔术角色,EOF或文件结尾通常 只是一个条件。操作系统知道每个文件有多大,并跟踪每个打开文件的读取位置。现在,如果某个文件的读取位置为1000
(从0开始)且文件长度为1000
个字节,并且您尝试阅读更多文件,则操作系统会说EOF
而不是给你更多的字节。
当然,这当然也不适用于BytesIO
,因为它不是文件,而是模拟它。 BytesIO(data)
的行为类似于可读文件,其大小为len(data)
,其字节为data
;但是在任何地方都没有实际的文件;使用BytesIO
Python可以模拟操作系统在其类似文件时的行为方式。因此,.read()
,在没有参数的情况下,总会将当前“文件”位置的所有数据返回到“文件”的末尾,即拼接data[current_file_position:]
。