如何确定字符串的内容类型
我收到了一些数据,格式是字符串。我需要把这些数据写入一个文件,但问题是,有时候这些数据是压缩过的(像.zip那样),有时候只是普通的文本。我需要判断一下这些数据的类型,这样我才能知道是该写入一个.txt文件还是一个.tgz文件。有没有什么好办法可以做到这一点?虽然我的数据是字符串而不是文件,我能不能用到mime类型呢?
谢谢。
4 个回答
1
正如一些回答已经提到的,你可以查看文件的前几个字节:
#!/usr/bin/env python
# $ cat hello.txt
# Hello World. I'm plaintext.
# $ cat hello.txt | gzip > hello.txt.gz
from struct import unpack
# 1F 8B 08 00 / gz magic number
magic = ('\x1f', '\x8b', '\x08', '\x00')
for filename in ['hello.txt', 'hello.txt.gz']:
with open(filename, 'rb') as handle:
s = unpack('cccc', handle.read(4))
if s == magic:
print filename, 'seems gzipped'
else:
print filename, 'seems not gzipped'
# =>
# hello.txt seems not gzipped
# hello.txt.gz seems gzipped
1
如果文件是从网络服务器下载的,你应该能看到一个内容类型(content-type),不过这要看网络服务器是否真的准确描述了文件的类型。
另一种方法是使用一些规则来猜测文件的类型。通常可以通过查看文件的前几个字节来做到这一点。
1
gzip和zip在压缩数据之前都有各自的头部信息,这些信息人类是看不懂的。如果你只是在这两者之间选择的话,你可以用比mimetypes
更快的方法来检查它们。