Python | 特定ファイルから他のファイルの操作方法
公開日:2021/6/12
Pythonでは特定のファイルから他のファイルを操作することができる.その際に"import"や"as"を利用する.以下にファイルの階層を確認しながら,操作方法を記す.
◆実施環境
Python 3.8.8
■準備
空のフォルダーを作成する.(フォルダー名は"section3″)
“section3″フォルダーをVS Codeから読み込む(File→Open Folder→"section3″フォルダーをダブルクリックをし,"フォルダーの選択"をクリックする).VS Codeは以下の画像になる.
“section3″フォルダー内に,"main.py","sub.py","test"フォルダーを作成する."test"フォルダー内に,"__init__.py","sample1.py","sample2.py"を作成する.
■"sys"の利用
“main.py"にて以下を記載し,ターミナルにて実行をする.
# 1の処理:"sys.path"とは,インタプリターが必要なモジュールを検索する際のディレクトリーのリストが含まれている.そのため,printを利用して,実行しているファイルの場所などを出力する.
# 2の処理:"sys.path.append()"を利用して,ディレクトリーを追加する.
# 1の処理(ファイルの場所などが出力される)
import sys
print(sys.path)
# 2の処理(ディレクトリを追加する)
import sys
print(sys.path)
sys.path.append('c:\\Users\\shiro\\Desktop') # ディレクトリを追加する
print(sys.path)
■実行結果
# 1の結果
['c:\\Users\\shiro\\Desktop\\210517_python development\\section3',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\python38.zip',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\DLLs',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\lib',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\lib\\site-packages']
# 2の結果
['c:\\Users\\shiro\\Desktop\\210517_python development\\section3',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\python38.zip',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\DLLs',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\lib',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv',
'C:\\Users\\shiro\\anaconda3\\envs\\djangoenv\\lib\\site-packages',
'c:\\Users\\shiro\\Desktop'] # 追加ディレクトリー
■"main.py"と"sub.py"を利用した出力
“main.py"と"sub.py"は同じフォルダーに格納されている.
(1) “main.py"にて# 1の処理,"sub.py"にて# 1の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#1の結果が出力される.
(2) “main.py"にて# 2の処理,"sub.py"にて# 2の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#2-1の結果が出力される.同条件で,ターミナルにて"sub.py"を実行すると,実行結果の#2-2の結果が出力される.
(3) “main.py"にて# 3の処理,"sub.py"にて# 3の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#3の結果が出力される.
(4) “main.py"にて# 4の処理,"sub.py"にて# 4の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#4の結果が出力される.
(5) “main.py"にて# 5の処理,"sub.py"にて# 5の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#5の結果が出力される.
(6) “main.py"にて# 6の処理,"sub.py"にて# 6の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#6の結果が出力される."*"はsubの中の全ての関数や変数などをimportできるが,明示されないため,エラーの原因になる.
■ main.py
# 1の処理
import sub
# 2の処理
import sub
# 3の処理
import sub
sub.intro_sub()
class_main = sub.ClassSub()
class_main.greeting()
# 4の処理
from sub import intro_sub
intro_sub()
# 5の処理
from sub import intro_sub as insub, ClassSub as clasub
insub()
class_main1 = clasub()
class_main1.greeting()
# 6の処理("*"の利用はエラーの原因となる)
from sub import *
intro_sub()
■ sub.py
# 1の処理
print('Hello from sub.py')
# 2の処理
if __name__ == '__main__':
print('Hello from sub.py')
# 3の処理
def intro_sub():
print('This is Taro from sub.py')
class ClassSub:
def greeting(self):
print('Good morning in ClassSub from sub.py')
# 4の処理
def intro_sub():
print('This is Taro from sub.py')
# 5の処理
def intro_sub():
print('This is Taro from sub.py')
class ClassSub:
def greeting(self):
print('Good morning in ClassSub from sub.py')
# 6の処理
def intro_sub():
print('This is Taro from sub.py')
■実行結果
# 1の結果
Hello from sub.py
# 2-1の結果
なし
# 2-2の結果
Hello from sub.py
# 3の結果
This is Taro from sub.py
Good morning in ClassSub from sub.py
# 4の結果
This is Taro from sub.py
# 5の結果
This is Taro from sub.py
Good morning in ClassSub from sub.py
# 6の結果
This is Taro from sub.py
■"main.py"と"sample1.py","sample2.py"を利用した出力
“main.py"と同じフォルダーに"test"フォルダーが格納されており,"test"フォルダーの中に"sample1.py"と"sample2.py"が格納されている.
(1) “main.py"にて# 1の処理,"sample1.py"にて# 1の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#1の結果が出力される.
(2) “main.py"にて# 1の処理,"sample1.py"にて# 1の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#1の結果が出力される.
(3) “main.py"と"sample1.py","sample2.py"にて# 3の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#3の結果が出力される.
■ main.py
# 1の処理(実行時にフォルダー名が必要)
import test.sample1
test.sample1.greeting_sample1()
# 2の処理(asを利用することで,実行時にフォルダー名を省略)
import test.sample1 as tes_sample1
tes_sample1.greeting_sample1()
# 3の処理(asを利用することで,実行時にフォルダー名と関数名を省略)
from test.sample1 import greeting_sample1 as gre_sample1
from test.sample2 import greeting_sample2 as gre_sample2
gre_sample1()
gre_sample2()
■ sample1.py
# 1の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
# 2の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
# 3の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
■ sample2.py
# 3の処理
def greeting_sample2():
print('Hello from sample2.py in test folder')
■実行結果
# 1の結果
Hello from sample1.py in test folder
# 2の結果
Hello from sample1.py in test folder
# 3の結果
Hello from sample1.py in test folder
Hello from sample2.py in test folder
■"main.py"と"sample1.py","sample2.py","__init__.py"を利用した出力
“main.py"と同じフォルダーに"test"フォルダーが格納されており,"test"フォルダの中に"sample1.py"と"sample2.py","__init__.py"が格納されている.
(1) “main.py"と"sample1.py","__init__.py"にて# 1の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#1の結果が出力される.
(2) “main.py"と"sample2.py","__init__.py"にて# 2の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#2の結果が出力される.
(3) “main.py"と"sample1.py","sample2.py","__init__.py"にて# 3の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#3の結果が出力される.
(4) “main.py"と"sample1.py","sample2.py","__init__.py"にて# 4の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#4の結果が出力される.
(5) “main.py"と"sample1.py","sample2.py","__init__.py"にて# 5の処理を記載し,ターミナルにて"main.py"を実行すると,実行結果の#5の結果が出力される.
■ main.py
# 1の処理(sample1.pyのprintが実行)
from test import *
sample1.greeting_sample1()
# 2の処理(__init__.pyにsample2がimportされていないので,エラーになる)
from test import *
sample2.greeting_sample2()
# 3の処理
from test import sample1_intro
sample1_intro()
from test import sample2_intro
sample2_intro()
# 4の処理(__init__.pyの[]に"sample2_greeting"が含まれていないのでエラーになる)
from test import *
sample1_greeting()
sample2_greeting()
# 5の処理
from test import *
from test import sample2_greeting
sample1_greeting()
sample2_greeting()
■ sample1.py
# 1の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
# 3の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
# 4の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
# 5の処理
def greeting_sample1():
print('Hello from sample1.py in test folder')
■ sample2.py
# 2の処理
def greeting_sample2():
print('Hello from sample2.py in test folder')
# 3の処理
def greeting_sample2():
print('Hello from sample2.py in test folder')
# 4の処理
def greeting_sample2():
print('Hello from sample2.py in test folder')
# 5の処理
def greeting_sample2():
print('Hello from sample2.py in test folder')
■ __init__.py
# 1の処理
from . import sample1
# 2の処理
from . import sample1
# 3の処理
from .sample1 import greeting_sample1 as sample1_intro
from .sample2 import greeting_sample2 as sample2_intro
# 4の処理
from .sample1 import greeting_sample1 as sample1_greeting
from .sample2 import greeting_sample2 as sample2_greeting
__all__ = ['sample1_greeting'] # importする対象を[]に入れると有効になる
# 5の処理
from .sample1 import greeting_sample1 as sample1_greeting
from .sample2 import greeting_sample2 as sample2_greeting
__all__ = ['sample1_greeting'] # importする対象を[]に入れると有効になる
■実行結果
# 1の結果
Hello from sample1.py in test folder
# 2の結果
NameError: name 'sample2' is not defined
# 3の結果
Hello from sample1.py in test folder
Hello from sample2.py in test folder
# 4の結果
Hello from sample1.py in test folder
NameError: name 'sample2_greeting' is not defined
# 5の結果
Hello from sample1.py in test folder
Hello from sample2.py in test folder
以上