🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2202閲覧

WindowsにおけるOpen関数のファイルパス指定の区切り文字について

foxfox

総合スコア7

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3グッド

1クリップ

投稿2018/03/19 10:52

編集2018/03/19 10:58

前提・実現したいこと

Open関数でファイルを開く際、ファイルへのパス情報が必要になりますが、Windows環境でファイルパスを指定する際にパスの区切りの記号は\を利用する必要がある、という知識が書籍やウェブサイトから得られます。
ただ、自分のWindows10の環境では、コマンドプロンプトからpythonを実行した際に、ファイルパスの指定の区切り文字にmacOSやLinux同様に/を使っても問題なくコマンドが実行されました。
10より前の、過去のWindowsではこのようなパス指定は無効だったということなのでしょうか?それともPython3.6.4だからこのような指定ができるのでしょうか

コマンドプロンプトへの入力

以下のコマンドはいずれも実行できる

file = open('C:/hoge/test.txt', 'w')
file = open('C:\hoge\test.txt', 'w')

補足情報

Windows 10 Pro バージョン 1703
Pythonのバージョン Python3.6.4

umyu, argparse, LouiS0616👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

私は主にWindowsプログラミングをしているのですが、「そう言えばいつの間にか'/'が使えるようになったなー。」と思ってたものの、いつからか、と問われれば定かではなかったので、少しググってみました。

同様なQ&Aを見つけましたのでご案内します。
ソース的にどれほど信憑性があるのかちょっと定かではないのですが、個人的に興味深いです。
When did Windows start accepting forward slash as a path separator?

これによると、実ははるか昔、Windowsの前身MS-DOS2.0の時代からスラッシュ(’/‘)もバックスラッシュ(日本では’¥’円マーク)もPATHセパレータとして内部的に両方使えたのですが、一部のコマンドやコードでちゃんとサポートしていなかったので、’¥’(バックスラッシュ)を常用するようになった経緯が伺い知れます。これは私も知りませんでした。
(MS-DOSやWindowsのコマンドラインでは、”/option” とのように指定することが多い)

ですので、

10より前の、過去のWindowsではこのようなパス指定は無効だったということなのでしょうか?

本来、OSの内部的には使えるんだけども、それをサポートするシェルやその他のコードで正しく実装しきれていなかったので、対外的に’¥’(バックスラッシュ、円マーク)を使うようアナウンスしていた、と言えるかと思います。

それともPython3.6.4だからこのような指定ができるのでしょうか

上記により、Python3.6.4 からだ、と言う訳ではないことになります。

他にも公式な情報、ソースやその他、有益な情報がありましたら私もぜひお聞きしたいです。間違いがあればご指摘ください。


2018/03/19 22:22 追記しました。
ウラを取る為、更にググってみました。wikipediaなのでこれも公式とは言えないですが、
Filename のReserved characters and wordsの項で、スラッシュについて

/ slash Used as a path name component separator in Unix-like, Windows, and Amiga systems. (For as long as the SwitChar setting is set to '/', the DOS COMMAND.COM shell would consume it as a switch character, but DOS and Windows themselves always accept it as a separator on API level.)

つたないながら意訳させてもらいますと、
「スラッシュはUNIX系、Windows、AmigaシステムでPATH名の区切りとして使われている。DOSのCOMMAND.COMシェルはこれを(コマンドラインのオプション)スイッチ用文字として使っているが、DOSとWindows自身はAPIレベルではいつでも'/'をPATHセパレーターとして受け付ける。」とあります。OS内部では'/'を正しく扱うように造られていそうです。

バックスラッシュ('¥'円マーク)については

\ backslash Used as the default path name component separator in DOS, OS/2 and Windows (even if the SwitChar is set to '-'; allowed in Unix filenames, see Note 1)

意訳:「バックスラッシュはDOS, OS/2, WindowsでデフォルトのPATH名区切り文字として使われている。」
です。

ちなみに若い方はご存じないかと思いますが、OS/2とははるか昔、Windows NT(Windows 10の直系のご先祖)と32ビットOSの覇権を奪い合ったIBMのOSです。Windows NTとWindow95の猛攻に敗れました。

投稿2018/03/19 11:45

編集2018/03/19 16:35
dodox86

総合スコア9254

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

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

foxfox

2018/03/20 02:10

歴史的な経緯については知らなかったので大変参考になりました。ありがとうございます。
guest

0

プログラム中で、ファイル名と決まっている物を指定する場合は、\でも/でもどちらでも使えます。少なくともWindows登場以前のMS-DOS時代からそうです。

コマンドラインから使う場合は、各種コマンドのコマンドラインの標準的な書式では/はオプションの始まりを表すのでパス区切りとは認識されません。
パス区切り文字を使った階層ディレクトリはMS-DOSver2からなので、それ以前は「パス区切り文字はどっち?」という疑問すら無かったです。
オプションの始まりが/なのははMS-DOS以前からそうですね。CP/M上で稼働するMicrosoft製のコマンド。このときにオプションに/を使ってしまったので、MS-DOSが出来たときにそれを引きずったと思われます。そのせいで、MS-DOSver2でパス区切り文字が必要になったときに/が使えず、仕方なく(?)\を使ったが、\は多くの言語でエスケープを意味するのでややこしくなってしまった。

パス区切りに\を使う話と、それをプログラムコードに書くときに多くの言語で\と書かないといけないことを、区別して認識してください。

投稿2018/03/19 15:01

編集2018/03/19 15:08
otn

総合スコア85886

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

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

dodox86

2018/03/19 15:25

CP/M時代のことから言及していただき、私も大変参考になります。どうもありがとうございます。
foxfox

2018/03/20 02:12

パスの区切りとコードの書き方は区別したほうが良いということ、これからは意識します。ありがとうございます。
dodox86

2018/03/20 02:21

プログラミングにおける注意を含め、簡潔にまとめられていて、回答としてはotnさんの方が良いと感じました。私のは個人的興味もあって色々書いてしまいましたが、要はググった結果の貼り付けだけでした。勉強になります。
guest

0

現時点でのMicrosoftの文書を確認してみました。
Naming Files, Paths, and Namespaces

以下の引用はグーグル翻訳済みのものです。より正確には原文確認ください。

パス

指定されたファイルへのパスは、特殊文字(バックスラッシュ)で区切られた1つ以上のコンポーネントで構成されます。

という記述をはじめ、この文書では区切り文字は「\」で統一されていました。

ただし

メモ Windows APIのファイルI / O関数は、次のセクションで説明する "\?"接頭辞を使用する場合を除いて、名前をNT形式の名前に変換する際に、 "/"を ""に変換します。

という記載が。だから「/」も使えるんですね。

投稿2018/03/20 02:33

can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問