Hướng dẫn are python files binary or text? - tệp python là tệp nhị phân hay văn bản?

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 are python files binary or text? - tệp python là tệp nhị phân hay văn bản?

Martin Thoma

Huy hiệu vàng 114K148574 Huy hiệu bạc879 Huy hiệu đồng148 gold badges574 silver badges879 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

384K183 Huy hiệu vàng949 Huy hiệu bạc1619 Huy hiệu Đồng183 gold badges949 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.

Nico Schlömer

49.1K25 Huy hiệu vàng186 Huy hiệu bạc226 Huy hiệu Đồng25 gold badges186 silver badges226 bronze badges

Đã 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 are python files binary or text? - tệp python là tệp nhị phân hay văn bản?

Jacob Gabrielsonjacob GabrielsonJacob Gabrielson

33.5K15 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 badges656 silver badges714 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 are python files binary or text? - tệp python là tệp nhị phân hay văn bản?

Guettliguettliguettli

24K66 Huy hiệu vàng309 Huy hiệu bạc592 Huy hiệu Đồng66 gold badges309 silver badges592 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.5331 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.2K9 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

Đâ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
0

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.9091 Huy hiệu vàng27 Huy hiệu bạc27 Huy hiệu đồng1 gold badge27 silver badges27 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
1

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

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àng60 Huy hiệu bạc118 Huy hiệu đồng8 gold badges60 silver badges118 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 badges656 silver badges714 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 badges656 silver badges714 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 are python files binary or text? - tệp python là tệp nhị phân hay văn bả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 are python files binary or text? - tệp python là tệp nhị phân hay văn bả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.2783 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 badges656 silver badges714 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 are python files binary or text? - tệp python là tệp nhị phân hay văn bản?

rsawrsawRexBarker

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

Các tệp Python có nhị phân không?

Trong Python, mô -đun IO cung cấp các phương thức của ba loại hoạt động IO; Các tập tin nhị phân thô, tệp nhị phân được đệm và tệp văn bản.raw binary files, buffered binary files, and text files.

Các tệp văn bản Python có phải không?

Một tệp trong Python được phân loại là văn bản hoặc nhị phân và sự khác biệt giữa hai loại tệp là quan trọng.Các tệp văn bản được cấu trúc như một chuỗi các dòng, trong đó mỗi dòng bao gồm một chuỗi các ký tự.Đây là những gì bạn biết là mã hoặc cú pháp., and the difference between the two file types is important. Text files are structured as a sequence of lines, where each line includes a sequence of characters. This is what you know as code or syntax.

Làm thế nào bạn có thể biết nếu một tệp là nhị phân hoặc văn bản?

Tiện ích mở rộng tệp chúng ta thường có thể biết nếu một tệp là nhị phân hoặc văn bản dựa trên phần mở rộng tệp của nó.Điều này là do theo quy ước, tiện ích mở rộng phản ánh định dạng tệp và cuối cùng là định dạng tệp chỉ ra xem dữ liệu tệp là nhị phân hay văn bản.based on its file extension. This is because by convention the extension reflects the file format, and it is ultimately the file format that dictates whether the file data is binary or text.

Tệp định dạng nhị phân trong Python là gì?

Khoa học dữ liệu thực tế bằng cách sử dụng các tệp "nhị phân" Python là bất kỳ tệp nào trong đó định dạng không được tạo thành từ các ký tự có thể đọc được.Các tệp nhị phân có thể bao gồm từ các tệp hình ảnh như JPEG hoặc GIF, tệp âm thanh như mp3 hoặc định dạng tài liệu nhị phân như Word hoặc PDF.Trong Python, các tệp được mở ở chế độ văn bản theo mặc định.any files where the format isn't made up of readable characters. Binary files can range from image files like JPEGs or GIFs, audio files like MP3s or binary document formats like Word or PDF. In Python, files are opened in text mode by default.