Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

121

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Làm thế nào tôi có thể biết nếu một tệp là nhị phân (không phải văn bản) trong Python?

Tôi đang tìm kiếm thông qua một tập hợp lớn các tệp trong Python và tiếp tục nhận các trận đấu trong các tệp nhị phân. Điều này làm cho đầu ra trông vô cùng lộn xộn.

Tôi biết tôi có thể sử dụng

import mimetypes
...
mime = mimetypes.guess_type(file)
3, nhưng tôi đang làm nhiều hơn với dữ liệu hơn là những gì GREP cho phép.

Trong quá khứ, tôi sẽ chỉ tìm kiếm các nhân vật lớn hơn

import mimetypes
...
mime = mimetypes.guess_type(file)
4, nhưng
import mimetypes
...
mime = mimetypes.guess_type(file)
5 và tương tự, làm cho điều đó không thể trên các hệ thống hiện đại. Lý tưởng nhất, giải pháp sẽ nhanh.

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

Martin Thoma

113K148 Huy hiệu vàng574 Huy hiệu bạc877 Huy hiệu đồng148 gold badges574 silver badges877 bronze badges

Khi được hỏi ngày 22 tháng 5 năm 2009 lúc 16:09May 22, 2009 at 16:09

7

Một phương thức khác dựa trên tệp (1) hành vi:

>>> textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
>>> is_binary_string = lambda bytes: bool(bytes.translate(None, textchars))

Example:

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False

Đã trả lời ngày 12 tháng 9 năm 2011 lúc 18:44Sep 12, 2011 at 18:44

JFSJFSjfs

383K182 Huy hiệu vàng948 Huy hiệu bạc1619 Huy hiệu đồng182 gold badges948 silver badges1619 bronze badges

13

Bạn cũng có thể sử dụng mô -đun Mimetypes:

import mimetypes
...
mime = mimetypes.guess_type(file)

Nó khá dễ dàng để biên dịch một danh sách các loại mime nhị phân. Ví dụ, Apache phân phối với tệp mime.types mà bạn có thể phân tích thành một tập hợp danh sách, nhị phân và văn bản và sau đó kiểm tra xem MIME có nằm trong danh sách văn bản hoặc danh sách nhị phân của bạn không.

Đã trả lời ngày 22 tháng 5 năm 2009 lúc 16:21May 22, 2009 at 16:21

Gavin M. Roygavin M. RoyGavin M. Roy

4.3714 Huy hiệu vàng35 Huy hiệu bạc29 Huy hiệu đồng4 gold badges35 silver badges29 bronze badges

7

Nếu bạn đang sử dụng python3 với UTF-8, nó sẽ thẳng tiến, chỉ cần mở tệp ở chế độ văn bản và dừng xử lý nếu bạn nhận được

import mimetypes
...
mime = mimetypes.guess_type(file)
6. Python3 sẽ sử dụng unicode khi xử lý các tệp ở chế độ văn bản (và bytearray ở chế độ nhị phân) - nếu mã hóa của bạn không thể giải mã các tệp tùy ý, rất có khả năng bạn sẽ nhận được
import mimetypes
...
mime = mimetypes.guess_type(file)
6.

Example:

try:
    with open(filename, "r") as f:
        for l in f:
             process_line(l)
except UnicodeDecodeError:
    pass # Fond non-text data

Đã trả lời ngày 16 tháng 5 năm 2015 lúc 8:14May 16, 2015 at 8:14

Skykingskykingskyking

Huy hiệu vàng 13.4K11 gold badge34 silver badges55 bronze badges

1

Thử cái này:

def is_binary(filename):
    """Return true if the given filename is binary.
    @raise EnvironmentError: if the file does not exist or cannot be accessed.
    @attention: found @ http://bytes.com/topic/python/answers/21222-determine-file-type-binary-text on 6/08/2010
    @author: Trent Mick <>
    @author: Jorge Orpinel <>"""
    fin = open(filename, 'rb')
    try:
        CHUNKSIZE = 1024
        while 1:
            chunk = fin.read(CHUNKSIZE)
            if '\0' in chunk: # found null byte
                return True
            if len(chunk) < CHUNKSIZE:
                break # done
    # A-wooo! Mira, python no necesita el "except:". Achis... Que listo es.
    finally:
        fin.close()

    return False

Đã trả lời ngày 9 tháng 6 năm 2010 lúc 1:14Jun 9, 2010 at 1:14

5

Nếu nó giúp, nhiều loại nhị phân bắt đầu bằng một số ma thuật. Dưới đây là danh sách các chữ ký tập tin.

Đã trả lời ngày 22 tháng 5 năm 2009 lúc 16:23May 22, 2009 at 16:23

Shane C. Masonshane C. MasonShane C. Mason

7.3483 Huy hiệu vàng25 Huy hiệu bạc33 Huy hiệu Đồng3 gold badges25 silver badges33 bronze badges

2

Đây là một đề xuất sử dụng lệnh tệp Unix:

import re
import subprocess

def istext(path):
    return (re.search(r':.* text',
                      subprocess.Popen(["file", '-L', path], 
                                       stdout=subprocess.PIPE).stdout.read())
            is not None)

Ví dụ sử dụng:

>>> istext('/etc/motd') 
True
>>> istext('/vmlinuz') 
False
>>> open('/tmp/japanese').read()
'\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf\xe3\x80\x81\xe3\x81\xbf\xe3\x81\x9a\xe3\x81\x8c\xe3\x82\x81\xe5\xba\xa7\xe3\x81\xae\xe6\x99\x82\xe4\xbb\xa3\xe3\x81\xae\xe5\xb9\x95\xe9\x96\x8b\xe3\x81\x91\xe3\x80\x82\n'
>>> istext('/tmp/japanese') # works on UTF-8
True

Nó có các nhược điểm của việc không thể di động đối với Windows (trừ khi bạn có một cái gì đó giống như lệnh

import mimetypes
...
mime = mimetypes.guess_type(file)
8 ở đó) và phải sinh ra một quy trình bên ngoài cho mỗi tệp, có thể không thể ngon miệng.

Đã trả lời ngày 22 tháng 5 năm 2009 lúc 16:28May 22, 2009 at 16:28

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

Jacob Gabrielsonjacob GabrielsonJacob Gabrielson

33.4K15 Huy hiệu vàng45 Huy hiệu bạc64 Huy hiệu đồng15 gold badges45 silver badges64 bronze badges

2

Sử dụng Thư viện Binaryornot (GitHub).

Nó rất đơn giản và dựa trên mã được tìm thấy trong câu hỏi StackOverflow này.

Bạn thực sự có thể viết điều này trong 2 dòng mã, tuy nhiên gói này giúp bạn không phải viết và kiểm tra kỹ lưỡng 2 dòng mã đó với tất cả các loại tệp kỳ lạ, đa nền tảng.

Kenorb

Phù bằng vàng 145K7676 gold badges655 silver badges712 bronze badges

Đã trả lời ngày 7 tháng 11 năm 2014 lúc 9:10Nov 7, 2014 at 9:10

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

Guettliguettliguettli

23.9K66 Huy hiệu vàng308 Huy hiệu bạc590 Huy hiệu Đồng66 gold badges308 silver badges590 bronze badges

Chúng ta có thể sử dụng python để kiểm tra xem tệp có nhị phân không, vì nó không thành công nếu chúng ta cố gắng mở tệp nhị phân ở chế độ văn bản

def is_binary(file_name):
    try:
        with open(file_name, 'tr') as check_file:  # try open file in text mode
            check_file.read()
            return False
    except:  # if fail then file is non-text (binary)
        return True

Caco

1.5231 Huy hiệu vàng26 Huy hiệu bạc49 Huy hiệu đồng1 gold badge26 silver badges49 bronze badges

Đã trả lời ngày 24 tháng 7 năm 2018 lúc 9:25Jul 24, 2018 at 9:25

SerhiiserhiiSerhii

Huy hiệu 691 Bạc1 Huy hiệu Đồng1 silver badge1 bronze badge

2

Thông thường bạn phải đoán.

Bạn có thể xem các phần mở rộng như một manh mối, nếu các tệp có chúng.

Bạn cũng có thể nhận ra các định dạng nhị phân biết và bỏ qua chúng.

Nếu không, hãy xem tỷ lệ của các byte ASCII không thể in mà bạn có và đoán từ đó.

Bạn cũng có thể thử giải mã từ UTF-8 và xem liệu điều đó có tạo ra đầu ra hợp lý không.

Đã trả lời ngày 22 tháng 5 năm 2009 lúc 16:14May 22, 2009 at 16:14

Douglas Leederdouglas LeederDouglas Leeder

51.1k9 Huy hiệu vàng91 Huy hiệu bạc136 Huy hiệu Đồng9 gold badges91 silver badges136 bronze badges

Một giải pháp ngắn hơn, với cảnh báo UTF-16:

def is_binary(filename):
    """ 
    Return true if the given filename appears to be binary.
    File is considered to be binary if it contains a NULL byte.
    FIXME: This approach incorrectly reports UTF-16 as binary.
    """
    with open(filename, 'rb') as f:
        for block in f:
            if b'\0' in block:
                return True
    return False

Đã trả lời ngày 2 tháng 7 năm 2012 lúc 21:45Jul 2, 2012 at 21:45

2

Hãy thử sử dụng Python-Magic hiện được duy trì hiện không phải là cùng một mô-đun trong câu trả lời của @Kami Kisiel. Điều này hỗ trợ tất cả các nền tảng bao gồm Windows tuy nhiên bạn sẽ cần các tệp nhị phân

import mimetypes
...
mime = mimetypes.guess_type(file)
9. Điều này được giải thích trong readme.

Không giống như mô -đun Mimetypes, nó không sử dụng tiện ích mở rộng của tệp và thay vào đó kiểm tra nội dung của tệp.

>>> import magic
>>> magic.from_file("testdata/test.pdf", mime=True)
'application/pdf'
>>> magic.from_file("testdata/test.pdf")
'PDF document, version 1.2'
>>> magic.from_buffer(open("testdata/test.pdf").read(1024))
'PDF document, version 1.2'

Đã trả lời ngày 17 tháng 6 năm 2019 lúc 17:22Jun 17, 2019 at 17:22

Ăn tại Joeseat tại JoesEat at Joes

4.7501 Huy hiệu vàng36 Huy hiệu bạc37 Huy hiệu đồng1 gold badge36 silver badges37 bronze badges

Nếu bạn không ở trên Windows, bạn có thể sử dụng Python Magic để xác định FileType. Sau đó, bạn có thể kiểm tra xem đó là loại văn bản/ mime.

Đã trả lời ngày 22 tháng 5 năm 2009 lúc 20:55May 22, 2009 at 20:55

Kamil Kisielkamil KisielKamil Kisiel

19.1k11 Huy hiệu vàng46 Huy hiệu bạc54 Huy hiệu đồng11 gold badges46 silver badges54 bronze badges

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
0

Tài liệu

Đã trả lời ngày 29 tháng 5 năm 2020 lúc 9:26May 29, 2020 at 9:26

j-teslaj-teslaj-tesla

471 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

Đây là một chức năng trước tiên kiểm tra xem tệp có bắt đầu bằng BOM hay không và nếu không tìm kiếm một byte số 0 trong các byte 8192 ban đầu:

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
1

Về mặt kỹ thuật, việc kiểm tra BOM UTF-8 là không cần thiết vì nó không nên chứa số byte cho tất cả các mục đích thực tế. Nhưng vì nó là một mã hóa rất phổ biến, nhanh hơn để kiểm tra BOM ngay từ đầu thay vì quét tất cả 8192 byte cho 0.

Đã trả lời ngày 4 tháng 5 năm 2017 lúc 17:21May 4, 2017 at 17:21

Roskakoriroskakoriroskakori

2.8991 Huy hiệu vàng27 Huy hiệu bạc27 Huy hiệu đồng1 gold badge27 silver badges27 bronze badges

Hầu hết các chương trình coi tệp là nhị phân (bất kỳ tệp nào không phải là "định hướng dòng") nếu nó chứa một ký tự null.

Dưới đây là phiên bản

try:
    with open(filename, "r") as f:
        for l in f:
             process_line(l)
except UnicodeDecodeError:
    pass # Fond non-text data
0 (
try:
    with open(filename, "r") as f:
        for l in f:
             process_line(l)
except UnicodeDecodeError:
    pass # Fond non-text data
1) của Perl được triển khai trong Python:

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
2

Cũng lưu ý rằng mã này đã được viết để chạy trên cả Python 2 và Python 3 mà không thay đổi.

Nguồn: "Guess If File là văn bản hoặc nhị phân" của Perl được triển khai trong Python

Umläute

26.9k8 Huy hiệu vàng59 Huy hiệu bạc116 Huy hiệu đồng8 gold badges59 silver badges116 bronze badges

Đã trả lời ngày 1 tháng 6 năm 2015 lúc 11:39Jun 1, 2015 at 11:39

Kenorbkenorbkenorb

Phù bằng vàng 145K7676 gold badges655 silver badges712 bronze badges

Tôi đến đây để tìm kiếm chính xác điều tương tự-một giải pháp toàn diện được cung cấp bởi thư viện tiêu chuẩn để phát hiện nhị phân hoặc văn bản. Sau khi xem xét các tùy chọn mà mọi người đề xuất, lệnh tệp NIX có vẻ là lựa chọn tốt nhất (tôi chỉ phát triển cho Linux Boxen). Một số người khác đã đăng các giải pháp bằng cách sử dụng tệp nhưng theo ý kiến ​​của tôi, chúng rất phức tạp, vì vậy đây là những gì tôi đã nghĩ ra:file command looks to be the best choice (I'm only developing for linux boxen). Some others posted solutions using file but they are unnecessarily complicated in my opinion, so here's what I came up with:

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
3

Nó sẽ không cần phải nói, nhưng mã của bạn gọi chức năng này sẽ đảm bảo bạn có thể đọc một tệp trước khi kiểm tra nó, nếu không, điều này sẽ bị phát hiện nhầm tệp là nhị phân.

Đã trả lời ngày 4 tháng 1 năm 2012 lúc 7:51Jan 4, 2012 at 7:51

rsawrsawrsaw

3.2352 Huy hiệu vàng27 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges27 silver badges30 bronze badges

Tôi đoán rằng giải pháp tốt nhất là sử dụng hàm đoán. Nó giữ một danh sách với một số mô phỏng và bạn cũng có thể bao gồm các loại của riêng bạn. Đây là kịch bản mà tôi đã làm để giải quyết vấn đề của mình:

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
4

Nó nằm trong một lớp, như bạn có thể thấy dựa trên cấu trúc của mã. Nhưng bạn có thể thay đổi khá nhiều những thứ bạn muốn thực hiện nó trong ứng dụng của mình. Nó khá đơn giản để sử dụng. Phương thức getTextFiles trả về một đối tượng danh sách với tất cả các tệp văn bản nằm trên thư mục bạn truyền trong biến đường dẫn.

Kenorb

Phù bằng vàng 145K7676 gold badges655 silver badges712 bronze badges

Tôi đến đây để tìm kiếm chính xác điều tương tự-một giải pháp toàn diện được cung cấp bởi thư viện tiêu chuẩn để phát hiện nhị phân hoặc văn bản. Sau khi xem xét các tùy chọn mà mọi người đề xuất, lệnh tệp NIX có vẻ là lựa chọn tốt nhất (tôi chỉ phát triển cho Linux Boxen). Một số người khác đã đăng các giải pháp bằng cách sử dụng tệp nhưng theo ý kiến ​​của tôi, chúng rất phức tạp, vì vậy đây là những gì tôi đã nghĩ ra:Aug 2, 2010 at 14:11

Nó sẽ không cần phải nói, nhưng mã của bạn gọi chức năng này sẽ đảm bảo bạn có thể đọc một tệp trước khi kiểm tra nó, nếu không, điều này sẽ bị phát hiện nhầm tệp là nhị phân.

Đã trả lời ngày 4 tháng 1 năm 2012 lúc 7:51

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
5

rsawrsaw

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
6

3.2352 Huy hiệu vàng27 Huy hiệu bạc 30 Huy hiệu Đồng

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
7

Tôi đoán rằng giải pháp tốt nhất là sử dụng hàm đoán. Nó giữ một danh sách với một số mô phỏng và bạn cũng có thể bao gồm các loại của riêng bạn. Đây là kịch bản mà tôi đã làm để giải quyết vấn đề của mình:May 29, 2017 at 23:48

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

Nó nằm trong một lớp, như bạn có thể thấy dựa trên cấu trúc của mã. Nhưng bạn có thể thay đổi khá nhiều những thứ bạn muốn thực hiện nó trong ứng dụng của mình. Nó khá đơn giản để sử dụng. Phương thức getTextFiles trả về một đối tượng danh sách với tất cả các tệp văn bản nằm trên thư mục bạn truyền trong biến đường dẫn.Rob Truxal

Kenorb3 gold badges19 silver badges39 bronze badges

0

Đã trả lời ngày 2 tháng 8 năm 2010 lúc 14:11

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
8

trên *Nix:

Nếu bạn có quyền truy cập vào lệnh shell

import mimetypes
...
mime = mimetypes.guess_type(file)
8, Shlex có thể giúp làm cho mô-đun phụ có thể sử dụng được nhiều hơn:May 22, 2009 at 16:14

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

Hoặc, bạn cũng có thể dán nó vào vòng lặp để lấy đầu ra cho tất cả các tệp trong DIR hiện tại bằng cách sử dụng:fortran

hoặc cho tất cả các tiểu khu:25 gold badges133 silver badges174 bronze badges

5

Đã trả lời ngày 29 tháng 5 năm 2017 lúc 23:48

>>> is_binary_string(open('/usr/bin/python', 'rb').read(1024))
True
>>> is_binary_string(open('/usr/bin/dh_python3', 'rb').read(1024))
False
9

Rob Truxalrob Truxal

import mimetypes
...
mime = mimetypes.guess_type(file)
0

5.2583 huy hiệu vàng19 Huy hiệu bạc39 Huy hiệu đồng

import mimetypes
...
mime = mimetypes.guess_type(file)
1

Bạn đang ở Unix? Nếu vậy, thì hãy thử:Jun 1, 2015 at 18:35

Kenorbkenorbkenorb

Phù bằng vàng 145K7676 gold badges655 silver badges712 bronze badges

Tôi đến đây để tìm kiếm chính xác điều tương tự-một giải pháp toàn diện được cung cấp bởi thư viện tiêu chuẩn để phát hiện nhị phân hoặc văn bản. Sau khi xem xét các tùy chọn mà mọi người đề xuất, lệnh tệp NIX có vẻ là lựa chọn tốt nhất (tôi chỉ phát triển cho Linux Boxen). Một số người khác đã đăng các giải pháp bằng cách sử dụng tệp nhưng theo ý kiến ​​của tôi, chúng rất phức tạp, vì vậy đây là những gì tôi đã nghĩ ra:

Nó sẽ không cần phải nói, nhưng mã của bạn gọi chức năng này sẽ đảm bảo bạn có thể đọc một tệp trước khi kiểm tra nó, nếu không, điều này sẽ bị phát hiện nhầm tệp là nhị phân.

import mimetypes
...
mime = mimetypes.guess_type(file)
2

Đã trả lời ngày 4 tháng 1 năm 2012 lúc 7:51Mar 21 at 15:31

Hướng dẫn python determine file type binary - python xác định loại tệp nhị phân

rsawrsawRexBarker

3.2352 Huy hiệu vàng27 Huy hiệu bạc 30 Huy hiệu Đồng13 silver badges11 bronze badges

Làm cách nào để kiểm tra xem tệp Python có phải là nhị phân không?

Bạn có thể kiểm tra xem: 1) Tệp chứa \ n 2) Số lượng byte giữa \ n tương đối nhỏ (điều này không đáng tin cậy) L 3) không có byte có giá trị nhỏ hơn giá trị của ký tự "không gian" ASCCI ('') - ngoại trừ "\ n" "\ r" "\ t" và 0.file contains \n 2) Amount of bytes between \n's is relatively small (this is NOT reliable)l 3) file doesn't bytes with value less than value of ASCCI "space" character (' ') - EXCEPT "\n" "\r" "\t" and zeroes.

Làm cách nào để xác định một tệp nhị phân?

Nói chung, các chương trình thực thi-hoặc sẵn sàng để chạy-được xác định là tệp nhị phân và được đưa ra một phần mở rộng tên tệp như.Bin hoặc .exe.executable -- or ready-to-run -- programs are identified as binary files and given a filename extension such as . bin or .exe.

Làm cách nào để hiển thị một tệp nhị phân trong Python?

Để mở một tệp ở định dạng nhị phân, thêm 'B' vào tham số chế độ.Do đó, chế độ "RB" mở tệp ở định dạng nhị phân để đọc, trong khi chế độ "WB" mở tệp ở định dạng nhị phân để viết.add 'b' to the mode parameter. Hence the "rb" mode opens the file in binary format for reading, while the "wb" mode opens the file in binary format for writing.

Tell () trong Python là gì?

Phương thức Tệp Python Tell () Phương thức Tell () trả về vị trí tệp hiện tại trong luồng tệp.returns the current file position in a file stream.