Pythonのos, os.pathモジュールの仕組みについて
開発環境
a.対象OS
Windows 10
b.開発エディタ
spyder 3.2.8
c.開発言語
python 3.6.5
d.質問対象モジュール
os os.path
質問の内容
os
モジュールでディレクトリとファイルを自在に操りたいのですが、値だけをとることができるのか、それとも、現在のファイルの指定地が本当に移ってしまうのか、わかりません。今までゴリ押し突破で、一貫した理解のないまま突き進んできました。
os.path.join(directory,target_directory_or_file) # つなげるだけ?つなげた後のファイルへと移る?ファイルは重複していてもいい?
os.chdir(directory) # そのディレクトリへ移る。
os.mkdir(directory) # 作った後にいく?作るだけ?
os.getcwd() # 現在のカレントディレクトリを返す。返すだけ?
os.remove(file) # 消すだけ。移動はないと思われる。
os.path.exists() # きっと移らない。存在確認だけ。
# ほかにもありますか・・・。
実行不可能な最小限度のコード
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()
生じるエラー
結構こういうエラーが起きます。
FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'J:\\a.txt\\mkdir_file'
[WinError 5] アクセスが拒否されました。
何を聞きたいのか
os
モジュールによる操作で、ファイルを作成したとき、ファイルに移動したとき、削除したとき、つなげた時、存在をチェックしたとき、現在のディレクトリを確認したとき等のファイルと、ディレクトリ指定の流れを確認したい。しくみを理解したい。
やろうと思えば、こうしたエラーは回避できないことはないのですが、その時のみで、根本の理解が出来ていないため、直ぐに忘れます。できれば後学参照のための知識のページにしたいです。ファイルの階層化なんて楽勝だというレベルになりたいです。
基本的には、以下の流れを実現したいです。
まず、ファイルの名前を決定する。
次に、ファイルを作りたい場所へと移る。
もし、既に同じ名前のファイルがあれば、それを消去し、改めて同じ名前のファイルを作る。(更新のため)
次に、一旦上の階層のファイルに戻ったりする。
そこに、新しいファイルを作り、そのファイルの中に入っていく。
これの繰り返しをしたいのですが、os
操作の理解ができていないので、結構てこずるのです。根本的な理解が出来れば、するするといけるような気がするのですが。
今のところの理解
ディレクトリとファイルは、入れ子状態で階層化されているというのは重々理解しているつもりです。しかし、実際それをos
で操るときに、今どこにポイントが存在しているのか、頭の中で整理がついておりません。ひょっとして理解はできているのかもしれませんが、実際の変数の読み違いによるコードの置き方が問題なのかもしれません。os
のメソッド群それ自体が、どのような機能を持っているのかはよくわかっています。
参考となる可能性のあるリンク等
os--雑多なオペレーティングシステム
os.path--共通のパス名操作
Win32エラーコード一覧