0
0

ファイルパス・作業ディレクトリのコピペ問題

Last updated at Posted at 2024-06-27

■はじめに

永遠のプログラミング初心者なので、何年もファイルパスの指定でアホの処理の仕方をしている。

まずPythonでは?

普通にファイルパスをコピペしてくるとこうなる。これで普通に動いてほしい。

"C:\Users\XXXXX\Desktop\XXXXX\XXXXX.pdf"

しかしpythonはこれでは動いてくれないので、ずっと毎回手動で\/に直してきた。
「理由は知らんが、\/に直せば動く」という事実だけは経験から学習しているので、毎回手動の力業でどうにかしてきたが、さすがにアホすぎる。

pdf_document = 'C:/Users/XXXXXXX/Desktop/xxxx.pdf'

Rでは?

setwd("C:\Users\XXXXX\Desktop\working directory\20220407_作業用")
getwd()

Rでも\では動いてくれない。

setwd("C:/Users/XXXXXX/Desktop/working directory")
getwd()

Rでも/なら動いてくれる。

■やること

プログラミングにおいて私が「めんどくさ~~~」と思うことは100%誰かが解決してくれている。ということで、下記の内容を行う:

\ではダメな理由を理解する
\/に直せば動く理由を理解する
・「毎回手動で直す」以外の対処方法を確認する

\ではダメな理由、\/に直せば動く理由

Pythonでは、バックスラッシュ(\)はエスケープ文字として機能する。
これは、特定の文字列を特別な文字(例えば、改行を表す\nやタブを表す\tなど)として解釈するために使用される。
そのため、ファイルパスにバックスラッシュが含まれていると、Pythonはそれをエスケープシーケンスとして解釈しようとしてくれる。

■「毎回手動で直す」以外の対処方法

Pythonの場合:頭文字「r」を付ける

文字列の最初に「そのまま」という意味の「raw」の頭文字「r」をつける。
これにより、エスケープシーケンスが行われず、そのままの文字列として扱われるようになる。

r'C:\Users\XXXXXX\Desktop\XXXXX\XXXXX.pdf'

この方法を使えば、手動でパスを修正する必要はなくなる。簡単~~:relaxed:便利~~:relaxed:

Rの場合:手動しかない

Rのsetwd関数を使用する際に、Windowsのファイルパスにはバックスラッシュ(\)が含まれているが、これはRのエスケープ文字として解釈されるため、正しくパスを認識させるためには各バックスラッシュをダブルバックスラッシュ(\)にするか、またはフォワードスラッシュ(/)を使用する必要がある。
さらに、文字列リテラルとしてパスを指定する際には、ダブルクォーテーション(")を使用する。

頭文字「r」をつける方法とは、リテラル文字列の前に小文字の「r」を付けて、その文字列内のエスケープシーケンスを無効にする方法だが、これはPythonの文字列リテラルにおけるraw文字列の記法であり、R言語には適用されない。

したがって、Rで正しいファイルパスを指定するには以下のように書き換える:

setwd("C:\\Users\\u1115885\\Desktop\\working directory\\20220407_作業用")

# または

setwd("C:/Users/u1115885/Desktop/working directory/20220407_作業用")

どちらの方法もRでファイルパスを正しく認識させられるが、手動対応でやるしかない。
この処理を一発でできるコマンドもないようである。

■感想

筆者が初めて触ったプログラミング言語がRだったため、ファイルパスは手動で直すのが普通だと思っていたが、Pythonではそうではないということが分かった。RとPythonの違いを発見することができてうれしい。

ぶっちゃけ動けばなんでもいいんだけど、ずっと「めんどくさ~~~」と思っていたことの理由と対処方法が分かると気持ち良い。

■参考

■追記

最近追加された機能で、Rにもraw文字列があるので手動じゃなくてもできるかもと教えてもらいました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0