【问题标题】:file i/o and the the meaning of binary modes文件 i/o 和二进制模式的含义
【发布时间】:2014-07-06 03:55:15
【问题描述】:

所以我想用python在redis中保存一些任意数据。由于redis通过将其存储为字符串来支持这一点,我认为我可以再次使用python读取日期并将其写入文件。起初这不起作用,因为我使用了 open() 的标准 'r' 和 'w' 模式。 Python确实说它们是平等的。

在我将其更改为“rb”和“wb”后,它可以工作,但为什么非二进制读取或写入会以某种方式更改数据?到底有什么意义呢?

这里有一些有效的代码,但只需将文件模式更改为非二进制并观察 testfile_read.zip 的变化。不过你确实需要 redis,使用 pip install redis 很容易安装

import redis
import os.path

version=1.0
path='testfile.zip'

r_server=redis.Redis("127.0.0.1")
fp = open(path,'rb')

test=fp.read()
fp.close()

r_server.hset('testfile',version,test)
r_server.hset('testfile','currver',version)


test2=r_server.hget('testfile',version)

if test==test2:
    print "read from file and read from redis are the same"
else:
    print "read from file and read from redis are the NOT!! same"

fp2 = open("testfile_read.zip",'wb')
fp2.write(test2)
fp2.close()

fp3 = open("testfile_read.zip",'rb')
test3=fp3.read()
fp3.close()

if test2==test3:
    print "redis is equal to written file"
else:
    print "redis is NOT!!! equal to written file"

【问题讨论】:

    标签: python file io binary


    【解决方案1】:

    非二进制模式用于让系统为你做一些额外的工作:

    一些具体的例子:

    • 阅读具有不同行尾样式(crlf vs cr vs lf)的文本时。例如,在 Windows 上读取 unix 样式文件时。
    • \n 字符将在 Windows 上转换为 \r\n
    • 读取输入时,各种选项(\r\n\r\n)将转换为正确的设置。
    • 如果文件以追加模式打开,并且有文件结束标记 (C-z) 如果文件以附加模式打开,则将检查文件的末尾,它将被删除。

    【讨论】:

    • 我现在明白了,但是我的代码会在非二进制模式下生成一个不同的文件
    • @prgmjunkie:是的,除非您正在编写特殊格式的文件,否则您通常需要这种行为。
    • 我正在编写一个标准文件,但不是文本文件。我知道我需要二进制,但我只是不知道为什么,现在我知道了!
    【解决方案2】:

    使用非二进制模式的原因是让文件调用为您对数据进行一些操作(例如,翻译行尾)。这就是为什么您不必太担心文本文件的来源;文件例程对您隐藏了这些细节。

    【讨论】:

    • 你的意思是unix和windows之间的区别吗? python 在非二进制模式下读取时是否真的会改变换行符?
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2016-06-15
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多