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

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

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

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

Q&A

解決済

3回答

4397閲覧

Raw文字列 → 文字列 変換がしたい。

shiojiri_takao

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/03/14 14:26

編集2019/03/14 14:43

前提・実現したいこと

よろしくお願いいたします。

別ファイルに定義した文字列をRaw文字列ではなく、文字列として取得する方法を探しています。

クライアントが送信したデータを受信すると、それに対応した文字列を返すWebアプリケーションを作成しています。
言語はPython 3.6です。

文字列は種類が多く色々な場所で呼ばれるため文字列用のファイルを作成し、コードに埋め込まない方法を考えています。
# app.py
受信したデータを解析し対応する文字列を文字列用ファイルから引っ張ってくる
# string.ini
キーと文字列のリスト

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

iniファイルとconfigparserの組み合わせで実現できそうだと思いコードを組んでみたのですが、
iniファイルに定義した文字列をconfigparser.get()で取得すると、
文字列はRaw文字列で、エスケープシーケンスも文字列として扱ってしまっています。

Raw文字列を通常の文字列に変換してくれる関数をご存知の方は教えていただけないでしょうか。

iniファイルとconfigparserを使わない他の実現方法も教えていただけるとありがたいです。

該当のソースコード

Python

1# app.py 2import configparser 3 4config = configparser.ConfigParser() 5config.read("./string.ini") 6 7str = config.get("string", "xxx") 8 9# string.ini 10[string] 11xxx="sample\nsample\nsample" 12 13# strの表示結果 14# 理想: 15# sample 16# sample 17# sample 18# 現実: 19# sample\nsample\nsample

調べたこと

repr()を使えば「文字列 → Raw文字列」の変換ができることはわかったのですが、
「Raw文字列 → 文字列」 の変換する方法は見つかりませんでした。

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

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

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

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

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

guest

回答3

0

「python バイナリ 文字列 変換」でぐぐるといろいろでてきますが、どうでしょうか

投稿2019/03/14 14:28

y_waiwai

総合スコア87749

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

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

LouiS0616

2019/03/14 14:39

iniファイルがバイナリで書かれているようにはどうにも思えないです。
shiojiri_takao

2019/03/15 10:24

y_waiwai様、LouiS0616様 コメントありがとうございます。 eval()で解決できることを確認しました。
y_waiwai

2019/03/15 11:33

\nを変換するだけならeval使うより、単純に置換するほうがいいのでは。
guest

0

やるとしたらevalですかね。

python

1import configparser 2 3config = configparser.ConfigParser() 4config.read("./string.ini") 5 6s = eval(config.get("string", "xxx")) 7print(s) 8""" => 9sample 10sample 11sample 12"""

考えられる問題点と対策:

  • 当たり前だがセキュリティ的に脆弱

→対策:ast.literal_evalで緩和はできる

  • pythonの文字列リテラルの表現として正確でないと受け付けない

→対策:なし。そういう文字列として書くことを仕様として義務付ける

投稿2019/03/14 14:46

hayataka2049

総合スコア30933

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

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

hayataka2049

2019/03/14 15:17 編集

あるいは、こんなのもありでしょうか。とりあえず動くけど、ちょっとこの方向で追求するのは嫌な感じがしますね。 print(s.encode("raw-unicode-escape").decode("unicode-escape")) """ => "sample sample sample" """
shiojiri_takao

2019/03/15 10:28

hayataka2049様 コメントありがとうございます。 脆弱性やサンプルコードも記載いただいてとてもわかりやすかったです。
guest

0

ベストアンサー

簡単には、eval()ですね。string.iniファイルの内容が完全にコントロールできるなら使ってもいいんじゃないでしょうか。

Raw文字列 → 文字列 変換がしたい。

では、最初何を言ってるのか分からなかった(Raw文字列というのはリテラル表記の仕方だけの問題なので)のですが、「文字列中の、\文字をエスケープシーケンスとして解釈したい」ということですね。

evalを使わないとすると、"\n""\n"に置換、"\t""\t"に置換、・・・・・などを変換したい文字の分だけ行います。何か良いライブラリがあるかも知れません。

投稿2019/03/14 14:45

otn

総合スコア84507

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

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

otn

2019/03/14 14:46

他人が書いたものが、string.ini に追加されるような運用なら、evalは脆弱性になります。
shiojiri_takao

2019/03/15 10:27

otn様 コメントありがとうございます。 eval()で問題が解決することを確認しました。 ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問