Python open関数

Pythonを勉強し始めてから、自然言語処理に興味を持ち、自然言語処理をし始めたときに、open関数の難しさや重要性をめちゃくちゃ感じたので備忘録として記します。

また、このサイト全般的には個人の備忘録として運営しております。認識の相違や誤った伝え方になる懸念性のあるものについては、コメント頂けると私の勉強にもなります。積極的に申し伝えていただけると助かります。(一番下にコメント欄がありますので、そちらを活用していただけると嬉しいです。)

Open関数の基本から話しましょう

Open関数には3つの役割があります。

Open関数の役割

ファイルを読み込む

ファイルを書き込む

ファイルを作成する

Open関数を使うことで3つの効果を得ることができます。また、細かい設定をすることで、どんな読み込み(書き込み)をするのか?まで指定することが可能となります。

使ってみて思ったのは、ややこしいけどすごく便利で、ややこしいのは機能がたくさんあるから。ということがわかりました。

僕はPython初心者なので、初心者が最初に覚えておいた方が良いOpen関数の使い方や調べて分かった根本を備忘録して書き記します。

■基本形

よく使う4つの引数について説明

Open関数で覚えておきたい4つの引数

ファイル

mode

encoding

errors

では、もうちょっと詳しく深堀していきましょう。

ファイルについて

これは、絶対に必要な引数です。場所を示す引数。どのファイルを開くのか?を示す重要な部分です。

単純にアドレスを入力してください。

modeについて

モードの引数には、どんな開き方?というのを聞かれています。読み込みなの?書き込みなの?とかを示すのがこの引数。

大体の書き方としては、open(file,mode=’rb’)とかで書くのが多いです。僕は特に今回のopen関数を調べるタイミングが自然言語処理を行うタイミングであったため、バイナリモードを使うタイミングが多かったです。

バイナリの意味が分かりませんでしたが、コンピュータがわかる言葉で示されてるデータのことだと認識すれば問題なさそうです。

引数 動作
r 読み込み用に開く(デフォルト)
w 書き込み用に開く
x 排他的な生成に開き、ファイルが存在する場合は失敗する
a 書き込み用に開き、ファイルが存在する場合は末尾に追記する
引数 動作
b バイナリ―モード
t テキストモード(デフォルト

encodingについて

文字コードは今回かなりの鬼門でした。そもそもで、この文字コードという考え方は何なのか?というのが一番謎だったので、いろいろと確認をしてみました。

ただ、僕としては文字コードという考え方すらもわからない状況であったため、理解するのにはかなり苦しみました。特に種類がある必要性が理解できません。種類が豊富だと何か良いことがあるのでしょうか?

そんな感じですが、いったんは開くときやDLしたときのファイルの文字コードによって引数で渡す文字コードは変化する。ということを認識しておけば良さそう!

文字コード 内容
utf-8 世界的にポピュラーな文字コードで文字化けの確率がかなり低い特徴があるが、少し重くなる傾向にある。
shift_jis 昔の携帯電話でも読み込みできる文字コード。比較的軽いがエンコードデータに制御文字を含むことが多いので、想定しないとエラーとなる場合がある。

どちらを使うにしても良いとは思いますが、そのファイルの文字コードを調べて合わせるというコードも作成しています。別の記事で紹介したいと思いますので、しばらくお待ちください。

errorsについて

この引数は、shift_jisの時にしか使わない印象があります。shift_jisには、制御コードも一緒に入っているので、文字コードのエラーが頻発します。そのため、エラーが起きたときの対処を決めておくと非常に便利です。

エラー対策 内容
ignore エラーが起きても無視する。文字コードが原因でのエラーが多い場合は、この引数を渡すよう勧められることが多い。
replace エラー箇所に置換マーカーを設置する。

ほかにもたくさんあるんですが、今のところ私が使ったことがあるのは、「ignore」「replace」の2つだけです。

上記の二つの使い方の違いとしては、テストバージョンでreplaceを使って、どこが変更されているか確認して、確認した後に変な感じになっていなければignoreを使って置換してしまいます。

4つを使い分けることがopen関数を使いこなすのにつながる

open関数で悩む分岐があるのが、4つの引数です。どういう開き方が妥当なのか?どうすればより効率よく開けるのか?エラーの可能性はあるのか?などコードを書く上で非常に重要な要素が多くあります。

Open関数を実際に使うならセットで覚えておくべき

実際にOpenを使うのであれば、効率の良い書き方があります。そのご紹介をしていきます。(随時追加予定)

withを使うと非常に便利!

私は変数に格納するパターンと、Withを使って一時的に開くパターンの両方を試してみました。むしろ最初は変数に格納するものしか使っていませんでした。

しかし、変数に格納するよりもWithの方が効率が良いことに気づきました。ほしい情報はすぐに変数に格納すれば良いですし、すぐに閉じてくれます。

いつまでも開いていく無駄に長くメモリの消費のあるコードを書く必要性はないと思います。

いつも使うコードをまとめる

私が使用頻度が高かった書き方をお伝えします。

書き込みモードの開き方

読み込みモードの開き方

最後に

Open関数は非常に使い方の幅が広い関数です。なので、まだまだ追加事項があると思いますので、適宜追加します。

Open関数は、7つの引数がありますが、その中でも4つの引数を意識しておいてください。そして、Withと合わせて使うと非常に便利です。

不足点や不明点がありましたら、コメントで示していただけると嬉しいです。