56718


**質問内容**  
ファイルを開いた後に、種別を判断したいのですが、スマートな方法はないでしょうか？

**やりたいこと**  
とあるデータをバイナリ形式とテキスト形式のどちらでも受け付けるようにしたいです。  
例えば、"F0FFFFFF000102"といったデータをバイナリ形式でもテキスト形式でも読み取りたい場合、以下のようなコードでファイルを開きます。

[code]

    path = filedialog.askopenfilename(initialdir = "/" ,title = "Select file",filetypes = (("binary files","*.bin"),("text files","*.txt"),("all files","*.*")))
    fp = open(path,'rb')
    data = fp.read()
    
[/code]

テキスト形式の場合、dataの中身は、

[code]

    data: b'f0ffffff000102
    
[/code]

バイナリ形式の場合、dataの中身は、

[code]

    data: b'\xf0\xff\xff\xff\x00\x01\x02
    
[/code]

そこで、文字列に変換して、'\x'を取り除けば、どちらの形式でも同じデータになると考えました。

[code]

    sdata = data.decode()
    data = sdata.strip('\x')
    
[/code]

しかし、バイナリ形式では、data.decode()の時点で、uft-8ではないため、エラーが発生します。  
何か良い方法はないでしょうか。

**使用している環境**  
OS: Windows10 Pro  
IDE: VisualStudioCode バージョン: 1.36.1 (user setup)


CC BY-SA 4.0
2019-07-17T08:56:59.930
56701
2019-08-30T05:21:53.873
2019-07-17T09:01:08.067
3060
32891
question
python python3
Pythonで開いたファイルの種別を判断したい


ファイルの種別を判断するためのlibmagicというライブラリがあります。  
[libmagic(3) - Linux manual page](http://man7.org/linux/man-
pages/man3/libmagic.3.html)

このlibmagicのPythonラッパーがいくつか存在するので、これを利用してみてはいかがでしょうか。

# python-magic

[ahupp/python-magic: A python wrapper for
libmagic](https://github.com/ahupp/python-magic)

>
[code]

>     >>> import magic
>     >>> 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'
>     >>> magic.from_file("testdata/test.pdf", mime=True)
>     'application/pdf'
>  
[/code]

>
> [python-magic/README.md at master · ahupp/python-
> magic](https://github.com/ahupp/python-
> magic/blob/8753c3cf284c1b83eaf0dd0f520400ec7652ee81/README.md)

# python-libmagic

[python-libmagic · PyPI](https://pypi.org/project/python-libmagic/)


CC BY-SA 4.0
2019-07-17T13:44:11.167
56706
2019-07-18T06:45:28.027
2019-07-18T06:45:28.027
29826
29826
56701
answer


ファイルタイプを判別する方法が別にありました。以下リンク先を参照してください。

[How to know the filetype through python - Stack
Overflow](https://stackoverflow.com/questions/5743548/how-to-know-the-
filetype-through-python)

具体的には以下のコードで十分です。日本語名のファイルも読み込めました。

[code]

    import mimetypes
    
    ret = mimetypes.guess_type(path, strict=True)
    
[/code]


CC BY-SA 4.0
2019-07-18T05:16:08.043
56718
2019-08-30T05:21:53.873
2019-08-30T05:21:53.873
3060
32891
56701
answer