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.
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 @ //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
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
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
0Tà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
1Về 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
2Cũ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
3Nó 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
4Nó 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
5rsawrsaw
>>> is_binary_string[open['/usr/bin/python', 'rb'].read[1024]]
True
>>> is_binary_string[open['/usr/bin/dh_python3', 'rb'].read[1024]]
False
63.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
7Tô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
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
8trê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
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
9Rob Truxalrob Truxal
import mimetypes
...
mime = mimetypes.guess_type[file]
05.2583 huy hiệu vàng19 Huy hiệu bạc39 Huy hiệu đồng
import mimetypes
...
mime = mimetypes.guess_type[file]
1Bạ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
rsawrsawRexBarker
3.2352 Huy hiệu vàng27 Huy hiệu bạc 30 Huy hiệu Đồng13 silver badges11 bronze badges