可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a folder full of files and these doesn\'t have an extension. How can I check file types? I want to check the file type and change the filename accordingly. Let\'s assume a function filetype(x)
returns file type like png
. I want to do this:
files = os.listdir(\".\")
for f in files:
os.rename(f, f+filetype(f))
How do I do this?
回答1:
There are Python libraries that can recognize files based on their content (usually a header / magic number) and that don\'t rely on the file name or extension.
If you\'re addressing many different file types, you can use python-magic
. That\'s just a Python binding for the well-established magic
library. This has a good reputation and (small endorsement) in the limited use I\'ve made of it, it has been solid.
There are also libraries for more specialized file types. For example, the Python standard library has the imghdr
module that does the same thing just for image file types.
回答2:
The Python Magic library provides the functionality you need.
You can install the library with pip install python-magic
and use it as follows:
>>> import magic
>>> magic.from_file(\'iceland.jpg\')
\'JPEG image data, JFIF standard 1.01\'
>>> magic.from_file(\'iceland.jpg\', mime=True)
\'image/jpeg\'
>>> magic.from_file(\'greenland.png\')
\'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced\'
>>> magic.from_file(\'greenland.png\', mime=True)
\'image/png\'
The Python code in this case is calling to libmagic beneath the hood, which is the same library used by the *NIX file
command. Thus, this does the same thing as the subprocess/shell-based answers, but without that overhead.
回答3:
On unix and linux there is the file
command to guess file types. There\'s even a windows port.
From the man page:
File tests each argument in an attempt to classify it. There are three
sets of tests, performed in this order: filesystem tests, magic number
tests, and language tests. The first test that succeeds causes the
file type to be printed.
You would need to run the file
command with the subprocess
module and then parse the results to figure out an extension.
edit: Ignore my answer. Use Chris Johnson\'s answer instead.
回答4:
import subprocess
p = sub.Popen(\'file yourfile.txt\',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output
As Steven pointed out, subprocess
is the way. You can get the command output by the way above as this post said
回答5:
You can also install the official file
binding for Python, a library called file-magic
(it does not use ctypes, like python-magic
).
It\'s available on PyPI as file-magic and on Debian as python-magic. For me this library is the best to use since it\'s available on PyPI and on Debian (and probably other distributions), making the process of deploying your software easier.
I\'ve blogged about how to use it, also.
回答6:
In the case of images, you can use the imghdr module.
>>> import imghdr
>>> imghdr.what(\'8e5d7e9d873e2a9db0e31f9dfc11cf47\') # You can pass a file name or a file object as first param. See doc for optional 2nd param.
\'png\'
Python 2 imghdr doc
Python 3 imghdr doc
回答7:
With newer subprocess library, you can now use the following code (*nix only solution):
import subprocess
import shlex
filename = \'your_file\'
cmd = shlex.split(\'file --mime-type {0}\'.format(filename))
result = subprocess.check_output(cmd)
mime_type = result.split()[-1]
print mime_type