关于python:file.read没有返回文件(.png)内容但奇怪的5字节的东西

file.read not returning file (.png) content but weird 5-byte thing

我正在编写一个基于basehttpserver的非常简单的Web服务器。现在让我吃惊的是(我是一个python初学者),python知道存在一个.png文件,但它没有正确读取;相反,它读取了一个带有"png"的奇怪的5字节字符串wending。所有其他文件,如HTML、JS等,都是正确读取和发送的。

不需要进一步的ADO,我的代码摘录,在do-get方法中:

1
2
3
4
5
6
7
8
9
10
11
localfilepath = curdir + sep + self.path
f = open(localfilepath)

fileContent = f.read()
fileType = os.path.splitext(localfilepath)[1]

print"isfile(%s): %s" % (self.path, str(os.path.isfile(localfilepath)))
if( len(fileContent) > 10 ):
    print"read %s file with length %s" % (fileType, str(len(fileContent)))
else:
    print"!read %s file: (length: %s, content: %s)" % (fileType, str(len(fileContent)), fileContent)

日志显示:

1
2
3
4
5
GET received; path: /AdaptrisSurvey/images/btn1_hover.png
127.0.0.1 - - [27/Sep/2014 19:18:03]"GET /AdaptrisSurvey/images/btn1_hover.png HTTP/1.1" 200 -
isfile(/AdaptrisSurvey/images/btn1_hover.png): True
!read .png file: (length: 5, content: ?PNG
)

(结尾处的右括号跟在新行后面,但如果没有段落的垂直缩进,我就无法在这里解决这个问题。)

由于它与其他文件一起工作,btn1_hover.png文件存在,并且是一个真实的图像,可以在我的标准图像查看器中显示,我对此没有想法。


您需要以二进制模式打开文件:

1
f = open(localfilepath,"rb")

否则,一旦读到属于PNG头段的SUB字符,它就会停止。


如果您真的想要一个二进制文件的文件大小,而不是文件的长度,那么您可能会看到这个涉及python文档的问题。-

1
os.path.getsize(path) #Return the size, in bytes, of path. Raise os.error if the file does not exist or is inaccessible.