文件I/O及二进制模式的含义

1 投票
2 回答
817 浏览
提问于 2025-04-18 06:53

我想用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),那么在追加模式下打开文件时,会检查文件的结尾并将其移除。

撰写回答