Saya memiliki folder yang penuh dengan file dan mereka tidak memiliki ekstensi. Bagaimana cara memeriksa jenis file? Saya ingin memeriksa jenis file dan mengubah nama file yang sesuai. Mari kita asumsikan suatu fungsi filetype(x)
mengembalikan tipe file seperti png
. Aku ingin melakukan ini:
files = os.listdir(".")
for f in files:
os.rename(f, f+filetype(f))
Bagaimana saya melakukan ini?
python
filesystems
identification
emnoor
sumber
sumber
file types
. Apakah maksud Anda menentukan apakah itu gif, png, bmp, atau jpg? Apakah Anda hanya ingin tahu apakah itu teks / biner? Dapat dieksekusi?Jawaban:
Ada pustaka Python yang dapat mengenali file berdasarkan kontennya (biasanya nomor header / ajaib) dan tidak bergantung pada nama file atau ekstensi.
Jika Anda menangani banyak jenis file yang berbeda, Anda dapat menggunakan
python-magic
. Itu hanya pengikatan Python untukmagic
pustaka yang sudah mapan . Ini memiliki reputasi yang baik dan (dukungan kecil) dalam penggunaan terbatas yang saya buat, ini solid.Ada juga perpustakaan untuk jenis file yang lebih khusus. Misalnya, pustaka standar Python memiliki
imghdr
modul yang melakukan hal yang sama hanya untuk jenis file gambar.Jika Anda memerlukan pemeriksaan jenis file bebas ketergantungan (Python murni), lihat
filetype
.sumber
python-magic-win64
berfungsi untuk saya di WindowsThe Python Sihir perpustakaan menyediakan fungsi yang Anda butuhkan.
Anda dapat menginstal pustaka dengan
pip install python-magic
dan menggunakannya sebagai berikut:>>> 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'
Kode Python dalam hal ini memanggil ke libmagic di balik kap mesin, yang merupakan pustaka yang sama yang digunakan oleh perintah * NIX
file
. Jadi, ini melakukan hal yang sama sebagai jawaban berbasis subproses / shell, tetapi tanpa overhead itu.sumber
import magic
memiliki konten yang tidak kompatibel. Lihat stackoverflow.com/a/16203777/3189 untuk lebih lanjut.python-magic
perpustakaan lebih efisien daripada menggunakan pendekatan subproses?Di unix dan linux ada
file
perintah untuk menebak jenis file. Bahkan ada port windows .Dari halaman manual :
Anda perlu menjalankan
file
perintah dengansubprocess
modul dan kemudian mengurai hasilnya untuk mengetahui ekstensi.edit: Abaikan jawaban saya. Gunakan jawaban Chris Johnson sebagai gantinya.
sumber
file
melakukan sebanyak itu.# file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
file
perintah ini adalah perintah ini asli (kebanyakan?) Pada distribusi Linux sedangkan yangpython-magic
tidak dan harus diunduh dan diinstal sebelum dapat digunakan. Ini agak menjadi masalah jika skrip yang menggunakan modul seharusnya portabel.Untuk gambar, Anda dapat menggunakan
imghdr
modul.>>> 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
sumber
Anda juga dapat menginstal
file
pengikatan resmi untuk Python, sebuah pustaka bernamafile-magic
(tidak menggunakan ctypes, sepertipython-magic
).Ini tersedia di PyPI sebagai file-magic dan di Debian sebagai python-magic . Bagi saya library ini adalah yang terbaik untuk digunakan karena tersedia di PyPI dan Debian (dan mungkin distribusi lain), membuat proses penerapan perangkat lunak Anda lebih mudah. Saya juga membuat blog tentang cara menggunakannya .
sumber
import subprocess p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE) output, errors = p.communicate() print(output)
Seperti yang ditunjukkan Steven,
subprocess
begitulah caranya. Anda bisa mendapatkan output perintah dengan cara di atas seperti yang dikatakan posting inisumber
Dengan pustaka subproses yang lebih baru, Anda sekarang dapat menggunakan kode berikut (solusi khusus * nix):
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
sumber
shlex.split
, mengapa tidak dijalankan sajasubprocess.check_output(['file', '--mime-type', filename])
?Anda juga dapat menggunakan kode ini (python murni dengan 3 byte file header):
full_path = os.path.join(MEDIA_ROOT, pathfile) try: image_data = open(full_path, "rb").read() except IOError: return "Incorrect Request :( !!!" header_byte = image_data[0:3].encode("hex").lower() if header_byte == '474946': return "image/gif" elif header_byte == '89504e': return "image/png" elif header_byte == 'ffd8ff': return "image/jpeg" else: return "binary file"
sumber
Hanya bekerja untuk Linux tetapi Menggunakan modul python "sh" Anda cukup memanggil perintah shell
https://pypi.org/project/sh/
pip instal sh
Keluaran: / root / file: teks ASCII
sumber