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

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

ただいまの
回答率

90.51%

  • Python 3.x

    8901questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 83

前提・実現したいこと

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

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

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

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

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

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

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

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

該当のソースコード

# app.py
import configparser

config = configparser.ConfigParser()
config.read("./string.ini")

str = config.get("string", "xxx")

# string.ini
[string]
xxx="sample\nsample\nsample"

# strの表示結果
# 理想:
# sample
# sample
# sample
# 現実:
# sample\nsample\nsample

調べたこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 23:46

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

    キャンセル

  • 2019/03/15 19:27

    otn様
    コメントありがとうございます。

    eval()で問題が解決することを確認しました。
    ベストアンサーとさせていただきます。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 23:39

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

    キャンセル

  • 2019/03/15 19:24

    y_waiwai様、LouiS0616様
    コメントありがとうございます。

    eval()で解決できることを確認しました。

    キャンセル

  • 2019/03/15 20:33

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

    キャンセル

0

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

import configparser

config = configparser.ConfigParser()
config.read("./string.ini")

s = eval(config.get("string", "xxx"))
print(s)
""" =>
sample
sample
sample
"""

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

  • 当たり前だがセキュリティ的に脆弱
    →対策:ast.literal_evalで緩和はできる
  • pythonの文字列リテラルの表現として正確でないと受け付けない
    →対策:なし。そういう文字列として書くことを仕様として義務付ける

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/15 00:17 編集

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

    キャンセル

  • 2019/03/15 19:28

    hayataka2049様
    コメントありがとうございます。

    脆弱性やサンプルコードも記載いただいてとてもわかりやすかったです。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    8901questions

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