PythonでDjangoやSeleniumを使用して作業をしている時に、形式的にはリスト(配列)として送付されてきたはずと思ったものが、受け取った中身を見たら文字列としてしか認識できないものだったということがありました。
大元とのやり取りなどでうまく解決できればよかったのですが、そこではどうしても解決できなかった(自分達に解決する能力がなかった?)時に、中身がリストの文字列を一旦文字列として取得後、なんとかリスト型に戻したりしたことがありましたので、備忘録として残しておきます。
目次
具体的には、以下のようなものです。
1.取得データ
まず、送られてくるリスト(配列)としてはどのようなものか、どんな種類のものがあるかということになり、いくつか受け取った取得データを見ながら考えていきました。
(1)タイプ1
以下のように、リスト内要素数が0個、1個、2個以上などで余分なスペースなどのないそれほど問題なさそうなタイプ。
ここで要素数0個もありというあたりは確認。
[] ['abc'] ['abc','def']
(2)タイプ2
リストの【】の外側や内側にスペースが入っていたり、区切りのカンマの両側にスペースが入っている場合でこれらのスペースは取り除く必要があるタイプ。
['abc'] [ 'abc'] ['abc' , 'def']
(3)タイプ3
シングルコーテーション内の文字列の中にスペースがあるタイプ
このタイプの場合には、スペースの内容によって取り除く必要がある場合とそのまま残さなければならない場合があります。
たとえば、以下のように正規の文字列「'abc'」の外側のスペースは取り除く必要があります。
正確には、自分たちがあとでこの文字列と一致比較をするため取り除いておく必要がありました。
[' abc']
しかしながら、別の例としてたとえば、以下のように、正規の文字列「'abc def'」の「'abc'」と「'def'」の間のスペースは本来必要なものなので取り除いてはいけないというようなものでした。
['abc def']
こんな内容でしたので、はじめに思っていたより意外に面倒かというところもあったのでやり方を残しておくことにしました。
2.リストへの復元処理内容
リストへの復元処理としては、最終的には以下のようなものになりました。
この内容でなんとか文字列化されたものでしか受け取れなかった問題をクリアして復元結果のリストを再作成することができました(と思います)。
wk = str_list.strip()
wk = wk.replace('[', '')
wk = wk.replace(']', '') wk = wk.replace("'", '') #wk = wk.replace(' ', '') list = wk.split(',') result_list = [s.strip() for s in list]
上記の内容としては、
まず、前提として上記コードの1行目の文字列「str_list」に先程いろいろと挙げた内容が含まれる「中身がリストの文字列」が入っているものとします。
(1)詳細内容
1行目のstrip()関数にて受け取った文字列の外側にもしスペースがあれば取り除いています。
実際には、そのようなデータは受領データの中に今のところなかったので確認はできていませんがおそらく。
次に、2,3,4,5行目でreplace()を使用して不要な文字を除外しようとしています。
2,3行目でリストの外側の【】を取り払っています。
ちなみに今回リスト内リストのような構造のものはありませんでした。
4行目では、文字列を囲む''(シングルコーテーション)を取り払っています。
除外対象がシングルコーテーションなので、囲みをダブルコーテーションに変更したら問題なかったのでこういう記載にしています。
その後、はじめは5行目で、スペースも一緒に取り除こうとしたのですが、ここで同様にやったところ、'abc def'の'abc'と'def'の間の取り除いてはいけないスペースのようなものも一緒に消え去ってしまったので最終的にコメント化しています。
ここまでで、シングルコーテーションで囲まれた文字列外の不要なカッコや不要なスペースという文字列を取り除いています(シングルコーテーション内のスペースは残)。
シングルコーテーション内の文字列(シングルコーテーション自体はすでになし)とカンマになったと思いますので、次の行(6行目)でsplit(',')を使用して文字列をカンマ区切りで分けてそれぞれの要素にその結果を変数にリストとして入れています。
最後に7行目でリストに入れられた各要素の外側にスペースがあればそれを取り除いています。
文「list」内の各要素「s」を1つ1つ取り出しながらstrip()関数で両端のスペースを取り除いています。
strip()関数なので文字列の中のスペースは取り除かずに両端のものだけ取り除いています。
最終行の変数「result_list」に入った結果が文字列だった「str_list」の内容をリスト化したものです。
今回の処理例は自分達の場合のデータにあった処理内容というところもあるかと思います。
不要なものとして取り除いたのは【】とスペースくらいですがそれ以外のものも取り除く必要などあるかもしれません。
そのまま使えそうであればいいですが、取得データの中身や処理内容に応じて変更を加える必要があれば適宜変更を加えてみてください。
関連記事:
【Python】キーボード、キー入力判定方法 - Django Girls and Boys 備忘録
【Python】keyboardライブラリでのキー入力検出に使用可能なキーの種類 - Django Girls and Boys 備忘録
【Python Selenium】各ブラウザ用のドライバーを自動アップデートする方法 - Django Girls and Boys 備忘録
【Python Selenium】Pythonで行うproxy環境設定方法 - Django Girls and Boys 備忘録
【PythonからWeb操作】seleniumのインストール手順 - Django Girls and Boys 備忘録
【PythonによるExcelファイルの読み書き】PythonのダウンロードからExcelファイルの読み書きまでの一通りすべての方法 - Django Girls and Boys 備忘録
【Python Selenium】ActionChainsによるキーの同時押し、連続操作などの使用方法 - Django Girls and Boys 備忘録
【Python】「文字列として受け取ったリスト」をリストに復元した時の対処方法、変換方法 - Django Girls and Boys 備忘録
【Python】ソースコードにコメントをつける方法(コメント化) - Django Girls and Boys 備忘録
【PythonでのExcelファイル読み書き方法】ファイルオープンしているファイル(アクティブファイル)への書込方法 - Django Girls and Boys 備忘録
【Python Selenium】Webサイトのスクレイピングなどで必要なフレーム間移動方法 - Django Girls and Boys 備忘録
【Python Selenium】ブラウザ用ドライバーのダウンロードとインストール方法 - Django Girls and Boys 備忘録
【PythonからWeb操作】selenium、各ブラウザ用ドライバーの最新バージョン確認、ダウンロード場所 - Django Girls and Boys 備忘録
【Python Selenium】新規ウインドウ追加時のウインドウ切替方法 - Django Girls and Boys 備忘録
【Python Selenium】ウインドウ表示時などでのWaitの方法、待機方法 - Django Girls and Boys 備忘録
【Python Selenium】新規ウインドウ(新規タブ)追加時のウインドウ切替方法(追加ハンドルをハンドル差異比較にて取得) - Django Girls and Boys 備忘録
【python】実行時に表示されるコンソールウインドウを非表示にする方法 - Django Girls and Boys 備忘録
【Python Selenium】Webサイトのソースコードをファイル保存する方法 - Django Girls and Boys 備忘録
【Python】キー入力によるプログラム終了処理、ループを抜けて次の処理へ移行する処理 - Django Girls and Boys 備忘録
【Python Excel】ExcelからのPython実行ファイル(アプリケーションファイル)起動方法 - Django Girls and Boys 備忘録
【Python】ログイン中のユーザ名を取得する方法 - Django Girls and Boys 備忘録
【Python Selenium】クローリング、スクレイピングにて対象ウインドウのソースコードを調べる方法 - Django Girls and Boys 備忘録
【Python Selenium】ウインドウのURLを指定して画面展開する方法と現在表示されているウインドウのURLとタイトルを取得する方法 - Django Girls and Boys 備忘録
【Python Selenium】ウインドウハンドル取得方法 - Django Girls and Boys 備忘録
【Python Selenium】ウインドウ内の要素取得、キーボード入力などする方法(name属性、id属性、class属性) - Django Girls and Boys 備忘録
【Python Selenium 要素取得】ウインドウハンドル取得方法(Chrome用) - Django Girls and Boys 備忘録
【Python Selenium】ウインドウ内の要素取得、キーボード入力などする方法(name属性、id属性、class属性)(Chrome用) - Django Girls and Boys 備忘録
【Python Selenium】f文字列(フォーマット文字列)、r文字列(raw文字列)について - Django Girls and Boys 備忘録
【Python】エスケープシーケンス(エスケープ文字)について - Django Girls and Boys 備忘録