2010-03-18 5 views
4

파일이 가득 찬 폴더가 있고 그 안에 일부 문자열을 검색하고 싶습니다. 문제는 일부 파일이 zip, exe, ogg 등일 수 있다는 것입니다. txt, PHP 등의 파일 만 열어서 검색하므로 어떤 파일인지 어떻게 확인할 수 있습니까? 파일 확장명을 신뢰할 수 없습니다.파일에 일반 텍스트가 포함되어 있는지 확인하는 방법은 무엇입니까?

+1

그냥'file'을 호출 할 수 있니? 그것은 많은 유형을 다룹니다. http://linux.die.net/man/1/file –

답변

3

Python interface ~ libmagic을 사용하여 파일 형식을 식별 할 수 있습니다.

>>> import magic 
>>> f = magic.Magic(mime=True) 
>>> f.from_file('testdata/test.txt') 
'text/plain' 

자세한 내용은 repo을 참조하십시오.

0

Linux를 사용중인 경우 file 명령 줄 도구의 출력을 구문 분석 할 수 있습니다.

5

사용 파이썬의 mimetypes 라이브러리 :

import mimetypes 
if mimetypes.guess_type('full path to document here')[0] == 'text/plain': 
    # file is plaintext 
+3

mimetypes는 파일의 filename.ext를 사용하여 파일 내용을 결정합니다. 파일 이름을 변경하여 위장하는 것은 정말 쉽습니다. "file"명령을 사용하는 * nix 시스템에서는 파일 자체를보고 내용이 어떻게 보이는지를 확인하기 때문에 더 안전합니다. "파일"도 스푸핑 될 수 있지만 적어도 내용을 보게됩니다. 아래 Sinan에 언급 된 python-magic과 같은 것이 더 안전합니다. 자세한 정보는 * nix에서 "man file"과 "man magic"을 참조하십시오. –

+3

OP가 특별히 파일 확장자에 의존 할 수 없다고 말한 다음 파일 확장자 만 보이는 정확한 답변을 표시한다는 것은 흥미 롭습니다. –

1

이런 식으로 뭔가를 시도 : 파일이 바이너리 인 경우

is_binay_file('<your file path name>') 

이 True를 반환합니다

def is_binay_file(filepathname): 
    textchars = bytearray([7,8,9,10,12,13,27]) + bytearray(range(0x20, 0x7f)) + bytearray(range(0x80, 0x100)) 
    is_binary_string = lambda bytes: bool(bytes.translate(None, textchars)) 

    if is_binary_string(open(filepathname, 'rb').read(1024)): 
     return True 
    else: 
     return False 

이 같은 방법을 사용 텍스트라면 False, 필요하다면 Fx로 바꾸면됩니다. 함수를 만든다 is_text_file - 나는 너에게 맡긴다.

관련 문제