質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

905閲覧

Pythonでstrをバイト文字列に変換する際にバックスラッシュが2本になってしまう

aqufiz

総合スコア70

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/03/17 05:23

実現したいこと

Pythonでstrをバイト文字列に変換する際にバックスラッシュが2本にならないようにしたい

前提

Python3.9.5

発生している問題・エラーメッセージ

Pythonで文字列をバイトに変換するとバックスラッシュが2本になってしまう。

該当のソースコード

Python

1strings = "\abc\aaa\www\hhh\a\j\d" 2byte_str = str.encode('utf-8') 3print(byte_string)

結果:b'\\abc\\aaa\\www\\hhh\\a\\j\\d'
期待:b'\abc\aaa\www\hhh\a\j\d'

試したこと

①下記のコードでreplaceを実行したところ、エラーは出ませんでしたが結果は変わりませんでした。

Python

1strings = "\abc\aaa\www\hhh\a\j\d" 2byte_str = str.encode('utf-8').replace(b'\\\\', b'\\') 3print(byte_string)

②文字列にbを付与して、バイトとして認識しないか試しましたが文字列として認識されてしまいました。

備考

今回は例としてStringsを作成していますが、Stringsは与えられた変数として、最初からバイト列に設定することはできないという前提でお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2023/03/17 05:36

質問内容とコードは合っているでしょうか? 提示コードを(「print(byte_str)」に直して)実行すると「b'utf-8'」と表示されます。
dameo

2023/03/17 06:53

コードがおかしいので以下のように修正します。 $ python Python 3.8.10 (default, Nov 14 2022, 12:59:47) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> "\abc\aaa\www\hhh\a\j\d".encode('utf-8') b'\x07bc\x07aa\\www\\hhh\x07\\j\\d' 結果は全く違いますね。中のバイト列を16進数で表示すると... >>> for b in b'\x07bc\x07aa\\www\\hhh\x07\\j\\d': ... print(hex(b)) ... 0x7 0x62 0x63 0x7 0x61 0x61 0x5c 0x77 0x77 0x77 0x5c 0x68 0x68 0x68 0x7 0x5c 0x6a 0x5c 0x64 >>> となります。バイト列リテラルの引用符の中はバイト列をASCIIコードの文字列にdecodeされたもので示されます。ASCIIコードにない文字はエスケープされます。詳しくは以下。 文字列およびバイト列リテラル https://docs.python.org/ja/3/reference/lexical_analysis.html#string-and-bytes-literals
guest

回答2

0

ベストアンサー

質問のコードが滅茶苦茶なので、正しいコードを書いているとして書いてみます。

まず、
pythonの文字列ではバックスラッシュはエスケープ文字なので、表示のときには「\\」と表示される
というのが原則なので、

結果:b'\\abc\\aaa\\www\\hhh\\a\\j\\d'
期待:b'\abc\aaa\www\hhh\a\j\d'

実際にバックスラッシュ文字が入っているとしたときに、期待のように表示させることはできません。

ではバックスラッシュが1つだとどうなるかというと、後ろの文字と合せて特殊文字やそのもじそのものを表わします。 b'\abc\aaa\www\hhh\a\j\d' なら先頭から、 \a, b, c,\a, a ...という感じです。 \aは ASCIIで 0x07 (BEL(警告))にあたる文字です。

質問の状況を再現する正しいコードはたぶんこれですね。

python

1strings = r"\abc\aaa\www\hhh\a\j\d" 2byte_str = strings.encode('utf-8') 3 4print(byte_str)

で、出力されるのは、やはりb'\\abc\\aaa\\www\\hhh\\a\\j\\d' ですが、これで\は1つずつしか入っていません。

バイト列に実際に\が2つ入っていないことを確認したければ、以下のようにファイルに落して、Hex表示できるエディタ(VScodeでもできますね)で開いてみるといいでしょう。

python

1with open('output_file.hex', mode='wb') as outf: 2 outf.write(byte_str)

イメージ説明

投稿2023/03/17 05:59

TakaiY

総合スコア12745

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aqufiz

2023/03/17 06:15

b'\aaa\aaa\aaa'の時とb'\\aaa\\aaa\\aaa'の時でlenの大きさが違うのはなぜなのでしょうか
TakaiY

2023/03/17 06:24

回答読めばわかると思いますが、'\a' が1文字 '\\' が1文字 です。 なので、 b'\aaa\aaa\aaa' は '\a', 'a', 'a','\a', 'a', 'a','\a', 'a', 'a' の 9文字 'b'\\aaa\\aaa\\aaa' は '\\', 'a', 'a', 'a', '\\', 'a', 'a', 'a', '\\', 'a', 'a', 'a' の 12文字 となります。
aqufiz

2023/03/17 06:54

回答ありがとうございます。 音声をバイナリデータとして取得して、len(data)すると4096と表示されるのですが、一度デコードしてからエンコードし直すと11600ほどの大きさになってしまします。これも、この文字認識の問題でしょうか。
TakaiY

2023/03/17 07:08 編集

音声データですか? それを、なにを使ってデコードしてからエンコードし直したんですか? 音声データと文字データはまったく別のデータ形式なので、関係無いと思いますよ。 もしかして、音声データをUTF-8でエンコードすると、テキストに落してくれると思っていたとか?
aqufiz

2023/03/17 07:17

音声データのバイナリデータをdecode('utf-8)するとテキストに落とされていると考えていました。 実際、b'音声のバイナリーデータ'をデコードすると、音声のバイナリーデータの部分を得ることができました。 しかし、こちらをエンコードしてもlen(b'音声のバイナリーデータ')よりもかなり大きい数値になってしまいました。
aqufiz

2023/03/17 07:19

ただ得られた"音声バイナリのデータ"を"音声バイナリのデータ".encode('utf-8)ではなく、b'"音声バイナリのデータ"’とした場合はlenが元の結果とおなしものになりました
TakaiY

2023/03/17 07:29

もう一度聞きますけど、音声データで「おはよう」と入っているデータをUTF-8でデコードしたら、"おはよう"という文字列が出てくると思ったということですか? であれば、そうはなりません。 そういうことがしたければ、音声認識のプログラムを作ることになります。 音声データをUTF-8のデータだとしてデコードすると、まあ、いわゆる文字化けした文字列データになりますね。大抵TF-8ととして解釈できにデータが含まれてしまうのでエラーになるでしょう。 できたとして、その結果をエンコードしてバイトレツに戻しても、多分、もとの音声には戻らないでしょう。サイズがどうなるかなどに特に意味はないと思いますよ。
guest

0

print()\ をエスケープして表示しているだけで、データ中では \ は1つのままです。len(strings)len(byte_str) を調べてみると変化がないことがわかるでしょう。

投稿2023/03/17 05:40

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aqufiz

2023/03/17 06:19

len(b'\abc\aaa\www\hhh\a\j\d')とlen(b'\\abc\\aaa\\www\\hhh\\a\\j\\d')ではサイズバックスラッシュの数以上に差が生じるのはなぜでしょうか
int32_t

2023/03/17 06:22

TakaiYさんが書いているとおり、\a が制御文字一文字だからですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問