文件i / o和二进制模式的含义

时间:2014-05-17 22:12:28

标签: python file io binary

所以我想用python在redis中保存一些任意数据。由于redis通过将其存储为字符串来支持这一点,我认为我可以再次使用python读取日期并将其写入文件。起初这没有用,因为我使用了标准的' r'和' w' open()模式。 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"

2 个答案:

答案 0 :(得分:2)

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

一些具体的例子:

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

答案 1 :(得分:1)

具有非二进制模式的原因是让文件调用为您执行一些数据操作(例如,转换行结尾)。这就是为什么你不必担心文本文件的来源;文件例程会隐藏这些细节。