Python を使用してバイナリ ファイルを読み書きする簡単な方法

高洛峰
リリース: 2017-02-23 11:22:32
オリジナル
3020 人が閲覧しました

一般に、Python 自体はバイナリをサポートしていませんが、それを補うモジュール、つまり struct モジュールが提供されています。

Python にはバイナリ型はありませんが、バイナリ型のデータを格納できます。つまり、文字列は 1 バイトに基づいているため、バイナリ型のデータを格納するのにこれは問題ではありません。

import struct

a=12.34

#aをバイナリに変換

bytes=struct.pack('i',a)

このとき、bytesは文字列stringであり、文字列はaと同じです。バイナリストレージの内容は同じです。

次に、逆の操作を実行します

既存のバイナリ データ バイト (実際には文字列) を Python データ型に変換します:

a,=struct.unpack('i',bytes)

注、 unpackタプルを返します

つまり、変数が 1 つだけの場合:

bytes=struct.pack('i',a)

次に、デコード時にこれを行う必要があります

a,=struct.unpack('i' ,bytes) または (a,)=struct.unpack('i',bytes)

a=struct.unpack('i',bytes) を直接使用する場合、a=(12.34,) は代わりにタプルになります。元の浮動小数点数は失われます。

複数のデータで構成されている場合は、次のようになります。

a='hello'

b='world!'

c=2

d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)
ログイン後にコピー

このときのバイトはバイナリ形式のデータであり、binfile.write(bytes) のようにファイルに直接書き込むことができます。

その後、必要に応じて bytes=binfile.read() で読み出すことができます

そして、struct.unpack() を通じて Python 変数にデコードします

a,b,c,d=struct.unpack( '5s6sif',bytes)

' 5s6sif' は fmt と呼ばれ、数字と文字で構成される書式設定された文字列です。5s は 5 文字の文字列、2i は 2 つの整数などを意味します。使用可能な文字と型は次のとおりです。 . ctype は Python で使用できることを意味します。 の型は 1 対 1 に対応します。


フォーマット Cタイプ Python バイト数
x パッドバイト 値なし 1
c char string長さ1 1
b signed char integer 1
B unsigned char integer 1
? _ブール ブール 1
h short integer 2
H unsigned short integer 2
i int 整数 4
I unsigned int integer または long 4
l long integer 4
L unsigned long long 4
q 長い長い long 8
Q unsignedlonglong long 8
f float float 4
d ダブル フロート 8
s char[] string 1
p char[] string 1
P void * long

最後のものは、4 バイトを占有するポインター型を表すために使用できます

C の構造体とデータを交換するには、一部の C または C++ コンパイラーがバイト アライメント (通常は 32 ビットの場合は 4 バイト) を使用することも考慮する必要があります。ユニットのシステムに加え、

原語別標準 セクション数standard 元のバイト数による
文字 バイトオーダー サイズと配置
@ native native 4 バイトで十分です
= ネイティブ 標準元のバイト数による
< リトルエンディアン 標準エンディアン
! ネットワーク (= ビッグエンディアン)

使用方法は、'@5s6sif'のようにfmtの先頭に置くことです

-----バイナリファイルの処理時に遭遇した問題-----

バイナリファイルの処理時に使用します、次のメソッドを使用する必要があります

binfile=open(filepath,'rb') を使用してバイナリファイルを読み取る

、または

binfile=open(filepath,'wb') を使用してバイナリファイルを書き込む必要があります

binfile=open(filepath,'r ') と同じ 結果の違いは何ですか?

2 つの違いがあります:

まず、「r」を使用するときに「0x1A」に遭遇すると、それはファイルの終わり、つまり EOF とみなされます。 「rb」を使用すると、この問題は発生しません。つまり、バイナリで書き込み、テキストで読み出す場合、「0X1A」が存在するとファイルの一部だけが読み出されます。 「rb」を使用すると、ファイルの最後まで読み取られます。

2 番目に、文字列 x='abc/ndef' の場合、len(x) を使用して長さを 7 にできます。/n は改行文字と呼ばれ、実際には '0X0A' です。テキスト モードで「w」を使用して書き込むと、「0X0A」は Windows プラットフォーム上で 2 つの文字「0X0D」と「0X0A」に自動的に変更されます。つまり、ファイルの長さは実際には 8 になります。 「r」テキスト モードで読み取ると、元の改行文字に自動的に変換されます。書き込み時に「wb」バイナリモードに変更すると、1文字は変更されず、読み取り時にそのまま読み込まれます。したがって、テキスト モードで書き込み、バイナリ モードで読み取る場合は、この余分なバイトを考慮する必要があります。 「0X0D」は復帰文字とも呼ばれます。
Linux では変わりません。 Linux は改行を表すために「0X0A」のみを使用するためです。

Python を使用してバイナリ ファイルを読み書きするための上記の簡単な方法 (推奨) は、エディターによって共有されるすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。

Python を使用してバイナリ ファイルを読み書きする簡単な方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート