文件I/O及二进制模式的含义
我想用Python把一些任意的数据存储到Redis里。因为Redis支持把数据当作字符串存储,所以我想用Python再把这些数据读出来,然后写到一个文件里。最开始我用的是标准的'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"
2 个回答
0
使用非二进制模式的原因是让文件操作可以帮你处理一些数据,比如转换行结束符。这就是为什么你不需要太担心一个文本文件是从哪里来的,因为文件处理的过程会把这些细节隐藏起来。
1
非二进制模式是用来让系统为你做一些额外工作的:
这里有一些具体的例子:
- 当你读取的文本有不同的换行风格时(比如crlf、cr和lf),例如在Windows上读取Unix风格的文件。
- 在Windows上,
\n
这个字符会被转换成\r\n
。 - 在读取输入时,各种选项(
\r
、\n
或\r\n
)会被转换成正确的格式。 - 如果文件是以追加模式打开的,并且文件中有文件结束标记(C-z),那么在追加模式下打开文件时,会检查文件的结尾并将其移除。