我以字符串形式接收一些數據。我需要將數據寫入文件,但問題是有時數據會被壓縮/壓縮,有時候它只是純文本。我需要確定內容類型,以便知道是將它寫入.txt文件還是.tgz文件。任何想法如何實現這一目標?即使我的數據是字符串,而不是文件,我可以以某種方式使用MIME類型嗎?如何確定字符串的內容類型
謝謝。
我以字符串形式接收一些數據。我需要將數據寫入文件,但問題是有時數據會被壓縮/壓縮,有時候它只是純文本。我需要確定內容類型,以便知道是將它寫入.txt文件還是.tgz文件。任何想法如何實現這一目標?即使我的數據是字符串,而不是文件,我可以以某種方式使用MIME類型嗎?如何確定字符串的內容類型
謝謝。
gzip和zip都在壓縮數據之前使用不同的頭文件,而不是用於人類可讀的字符串。如果僅在這些之間進行選擇,則可以進行比mimetypes
提供的更快的檢查。
您可以嘗試mimetypes
模塊:http://docs.python.org/library/mimetypes.html。
這裏的東西一起玩:
print mimetypes.guess_type(filename)
祝你好運!
mimetypes只適用於文件名,而不適用於內容 – 2011-01-21 22:52:40
如果文件是從網絡服務器下載的,則應該有一個內容類型來查看,但無論您是否真正描述該文件的類型,您都受網絡服務器的支配。
另一種選擇是使用啓發式來猜測文件類型。這通常可以通過查看文件的前幾個字節來完成
由於一些答案已經建議,你可以窺視到該文件的第一個字節:
#!/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
由於我以一個字符串開頭,我不需要解壓任何東西,我只是用str.startswith()來檢查前四個字節,看它是否與你的神奇數字匹配提供。似乎很好。謝謝! – kkeogh 2011-01-21 20:34:09
這是類似的問題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