2011-01-20 51 views
2

我以字符串形式接收一些数据。我需要将数据写入文件,但问题是有时数据会被压缩/压缩,有时候它只是纯文本。我需要确定内容类型,以便知道是将它写入.txt文件还是.tgz文件。任何想法如何实现这一目标?即使我的数据是字符串,而不是文件,我可以以某种方式使用MIME类型吗?如何确定字符串的内容类型

谢谢。

+0

这是类似的问题http://stackoverflow.com/questions/43580/how-to-find -mime-py-in-a-file-in-python。在https://github.com/ahupp/python-magic上查看链接到python-magic的答案。 – 2011-01-21 22:55:37

回答

1

gzip和zip都在压缩数据之前使用不同的头文件,而不是用于人类可读的字符串。如果仅在这些之间进行选择,则可以进行比mimetypes提供的更快的检查。

1

如果文件是从网络服务器下载的,则应该有一个内容类型来查看,但无论您是否真正描述该文件的类型,您都受网络服务器的支配。

另一种选择是使用启发式来猜测文件类型。这通常可以通过查看文件的前几个字节来完成

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 
+0

由于我以一个字符串开头,我不需要解压任何东西,我只是用str.startswith()来检查前四个字节,看它是否与你的神奇数字匹配提供。似乎很好。谢谢! – kkeogh 2011-01-21 20:34:09

相关问题