49087


**開発環境**  
a. **対象OS**  
Windows 10  
b. **開発エディタ**  
spyder 3.2.8  
c. **開発言語**  
python 3.6.5  
d. **質問対象モジュール**  
os os.path

**質問の内容**  
`os`モジュールでディレクトリとファイルを自在に操りたいのですが、値だけをとることができるのか、それとも、現在のファイルの指定地が本当に移ってしまうのか、わかりません。今までゴリ押し突破で、一貫した理解のないまま突き進んできました。

[code]

    os.path.join(directory,target_directory_or_file) # つなげるだけ？つなげた後のファイルへと移る？ファイルは重複していてもいい？
    os.chdir(directory)                              # そのディレクトリへ移る。
    os.mkdir(directory)                              # 作った後にいく？作るだけ？
    os.getcwd()                                      # 現在のカレントディレクトリを返す。返すだけ？
    os.remove(file)                                  # 消すだけ。移動はないと思われる。
    os.path.exists()                                 # きっと移らない。存在確認だけ。
                                                     # ほかにもありますか・・・。
    
[/code]

**実行不可能な最小限度のコード**

[code]

    import os
    import sys
    from PySide import QtCore
    from PySide import QtGui
    
    class OsOperator(QtGui.QMainWindow):
        def __init__(self,parent=None):
            super(OsOperator,self).__init__(parent=None)
    
            self.menu = QtGui.QMenu("file")
            self.menu_act = QtGui.QAction("open",self.menu)
            self.menu.addAction(self.menu_act)
            self.menubar = QtGui.QMenuBar()
            self.menubar.addMenu(self.menu)
            self.setMenuBar(self.menubar)
            self.connect(self.menu_act,QtCore.SIGNAL("triggered(bool)"),self.open_file)
    
        def open_file(self):
            directory = os.getcwd()
    
            get_filename = QtGui.QFileDialog().getSaveFileName(self,"名前をつけてファイルを保存",directory,"*.txt","*.txt")[0] 
            #linux diretory type into windows directory type
            get_filename = QtCore.QDir().toNativeSeparators(get_filename)
    
            if os.path.exists(os.path.join(get_filename,"mkdir_file")):
                os.remove(os.path.join(get_filename,"mkdir_file"))
            if not os.path.exists(os.path.join(get_filename,"mkdir_file")):
                os.mkdir(os.path.join(get_filename,"mkdir_file"))
    
            os.chdir(get_filename,"mkdir_file")
            file = QtCore.QFile("temporary.txt")
            file.open(QtCore.QIODevice.ReadOnly)
            out = QtCore.QDataStream(file)
            out.writeQString("草刈りが大変です。")
            file.close()
    
    def main():
        try:
            QtGui.QApplication([])
        except Exception as e:
            print(e)
        w = OsOperator()
        w.show()
    
        sys.exit(QtGui.QApplication.exec_())
    
    if __name__ == "__main__":
        main()
    
[/code]

**生じるエラー**  
結構こういうエラーが起きます。  
`FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'J:\\a.txt\\mkdir_file'`  
`[WinError 5] アクセスが拒否されました。`

**何を聞きたいのか**  
`os`モジュールによる操作で、ファイルを作成したとき、ファイルに移動したとき、削除したとき、つなげた時、存在をチェックしたとき、現在のディレクトリを確認したとき等のファイルと、ディレクトリ指定の流れを確認したい。しくみを理解したい。

やろうと思えば、こうしたエラーは回避できないことはないのですが、その時のみで、根本の理解が出来ていないため、直ぐに忘れます。できれば後学参照のための知識のページにしたいです。ファイルの階層化なんて楽勝だというレベルになりたいです。  
基本的には、以下の流れを実現したいです。  
まず、ファイルの名前を決定する。  
次に、ファイルを作りたい場所へと移る。  
もし、既に同じ名前のファイルがあれば、それを消去し、改めて同じ名前のファイルを作る。（更新のため）  
次に、一旦上の階層のファイルに戻ったりする。  
そこに、新しいファイルを作り、そのファイルの中に入っていく。  
これの繰り返しをしたいのですが、`os`操作の理解ができていないので、結構てこずるのです。根本的な理解が出来れば、するするといけるような気がするのですが。

**今のところの理解**  
ディレクトリとファイルは、入れ子状態で階層化されているというのは重々理解しているつもりです。しかし、実際それを`os`で操るときに、今どこにポイントが存在しているのか、頭の中で整理がついておりません。ひょっとして理解はできているのかもしれませんが、実際の変数の読み違いによるコードの置き方が問題なのかもしれません。`os`のメソッド群それ自体が、どのような機能を持っているのかはよくわかっています。

**参考となる可能性のあるリンク等**  
[os--雑多なオペレーティングシステム](https://docs.python.jp/3/library/os.html)  
[os.path--共通のパス名操作](https://docs.python.jp/3/library/os.path.html#module-
os.path)  
[Win32エラーコード一覧](http://ir9.jp/prog/ayu/win32err.htm)


CC BY-SA 4.0
2018-10-09T04:28:57.553
49083
2018-10-09T07:12:11.643
2018-10-09T07:12:11.643
3060
24284
question
python python3
Pythonのos, os.pathモジュールの仕組みについて


質問多すぎっす。全部記すには余白が足らない、のレベルですね。

<https://docs.python.jp/3/library/os.path.html>  
には、パス名を操作する便利な関数とだけ書かれています。つまり「パス名」を操作するだけです。コンピュータは行間など読みませんから、マニュアルに書かれていないことはしません（マニュアルを書く側が、そのように心がける必要があります）
`os.path` の階層の関数群は、作ったパス文字列で何かすることはありません。

<https://docs.python.jp/3/library/os.html>  
同じく書かれていないことを勝手にしたりはしないので  
`os.mkdir` はディレクトリを作るだけで勝手に `os.chdir` しません。  
`os.getcwd` はカレントディレクトリを返すだけです。

っていうか普通にコマンドプロンプト (Windows) なり、シェル (Linux)
なり使ったことないですか？その経験がないからなんとなく納得できていないんだと思います。シェル窓で普通に `mkdir`
したらディレクトリが作られるだけで勝手に `chdir` されません。 `pwd`
したってカレントディレクトリは変わりません。ぜひ一度コマンドプロンプトなりシェル窓なりで心行くまで手でファイル・ディレクトリ操作してみてください。


CC BY-SA 4.0
2018-10-09T05:28:53.140
49087
2018-10-09T05:28:53.140
8589
49083
answer


例えばファイルの削除を行う場合、Windowsなら`del`コマンド、Linuxなら`rm`コマンドの様に、OSによって使用するコマンドが異なるケースがあります(中には共通の名前を持つものもあります)。

Pythonは複数のOS上で動く言語なので、これらの違いをなるべく意識せずに統一したコマンドで実行できるようにしたのが`os`モジュール、`os.path`モジュール等です。

> 今どこにポイントが存在しているのか、頭の中で整理がついておりません。

これを確認するのが`os.getcwd()`です。その他のメソッドも774RRさんが書かれている通り、OS本来のコマンドとの対応付けを意識しながら使用すると理解しやすいんじゃないかと思います。


CC BY-SA 4.0
2018-10-09T05:44:02.280
49088
2018-10-09T05:44:02.280
3060
49083
answer