WeSeong ログイン
← 記事一覧に戻る
プログラミング言語

Pythonでのファイルの読み書き、クラス

Pythonでのファイルの読み書き、クラス

Pythonに関する記事は今後も続く可能性がありますが、とりあえず、ここまでとします。 ネットワークまたはLinux 関連する記事の掲載が予定されています。 Pythonに関する投稿がわずか4つしかないにも関わらず、これらの4つの投稿だけでPythonを完全に理解できるというのは、ありえないことです。 私が投稿した1つの見出しだけでも、十分な議論を生み出す可能性があるため、これまでの投稿は、要約や入門編として捉えていただけると良いでしょう。あるいは、「この順番で学習すれば良いのかな」と考えていただければと思います。それでは、始めましょう!


Ⅰ. 概要

Pythonで ファイル読み込んだり、生成したりすることができます。ファイルの読み書きは、予想以上に重要であり、さまざまな用途に活用できます。ファイルの読み込みや書き込みの際に使用される関数は、 open() 関数が存在します。ファイルを読み込む際には readline(), readlines() 関数を使用します。ファイルを書き込む際には write(), writelines() 関数を使用します。オブジェクト指向プログラミングの重要な要素です。 クラス そのような概念があります。Pythonも同様に、オブジェクトをクラスとして定義することができます。 特性行為 その基礎に基づいてプログラミングを行います。クラスは 変数わあ 手法これらの要素から構成され、主に生成、動作、そして消滅の段階に分けられます。 「製品のライフサイクル」クラスに固有のメソッドを持つ。 __del__() 関数と __add__() 関数が存在します。このクラスは、他のクラスに 相続これは可能ですが、ここでは「継承」とは、親クラスと子クラスの関係のように、あるクラスが別のクラスの特性を受け継ぐことを意味します。


組み込み関数



Ⅱ. Pythonファイルの読み込みと書き込み

なぜ、ファイルを読み書きする機能をPythonで学ぶのか、疑問に思うかもしれません。 しかし、ファイルの読み書きは プログラミングは、予想以上に重要です。 例えば、ウェブプロジェクトの際に大量のデータをデータベースに保存する際、Pythonを活用した自動化がよく用いられます。この自動化の過程で、入力されたデータをファイルとして保存したり、Excel、Word、PDF、テキストファイルなどを読み込んで利用する際に、ファイル読み書きが用いられます。ただし、この投稿で述べられている内容だけでは、上記のようなすべての機能を実行できるわけではありません。ファイル読み書きに利用できる様々な… 図書館基本的なファイルの読み書きを理解していれば、さらに他のライブラリを学ぶことをお勧めします!😊


※ 補足:もし Linux一緒に コマンドラインインターフェース (CLI)もしLinuxを使用する場合は、ファイルの読み書きが特に重要になります。Linuxは、CLI(コマンドラインインターフェース)を使用する際に、クラウドサービスと連携するために利用されるオペレーティングシステムです。CLIは、データをテキスト形式で伝達し、プログラムを実行する機能を持つため、テキスト形式のファイルからデータを読み書きしたり、自動化されたプログラムを作成して利用したりすることができます。 Windows 同じ GUI(グラフィカル・ユーザー・インターフェース)これは、マウスやキーボードを使って簡単に操作できます。主な理由は、CLI(コマンドラインインターフェース)は、基本的にグラフィック要素を使用しないからです。グラフィック要素を使用すると、多くの 資源そのため、メモリの管理が非常に重要になります。ファイルへの読み書きを理解しておくことが役立ちます。


ファイルの読み込みと書き込みの両方 3段階のプロセスこれに対して対応する。 まず、ファイルを開きます。次に、ファイルを読み込んだり、書き込んだりします。最後に、ファイルを閉じます。

まず、ファイルのオープンは、読み込んだり書き込んだりする際に必ず行われるプロセスです。 open() 関数を使用して、open() 関数の戻り値を活用する ファイルハンドラこれにより、ファイルが正常に受信され、利用可能な状態になります。ただし、この時点ではファイルの内容を直接読み込んだり、書き込んだりすることはできません。正常に動作している場合は、ファイルが利用可能になる前の状態です。

file = open('경로와 파일이름', '읽기 모드, 쓰기 모드 중 선택', '인코딩 요소')

`open()` 関数には様々な引数がありますが、基本的には上記の例で示されている引数がよく使われます。 経路経路によっては、多くのエラーが発生する可能性があるため、注意が必要です。 「読みモード」基本的には 「r」作成可能で 「書き込みモード」「w」上記のように記述します。また、他にも様々なモードがあるため、実際に試しながら、さらに多くのモードを探して活用してみるのが良いでしょう。 文字コード(文字エンコーディング) 要素は必須ではありませんが、ファイルのエンコーディングによっては、ハングルが文字化けする可能性があります。 ASCIIコード、Unicodeこの概念について理解することは重要ですが、このテーマに関する多くの優れた記事があるため、ぜひ調べてみてください。一般的に私たちが使用しているエンコーディングは、 'UTF-8'それはそうです。


※ 補足:ルート 対向経路わあ 絶対パス現在位置にあるディレクトリから、利用可能なファイルを特定します。絶対パスは、ルートディレクトリから利用可能なファイルを特定します。相対パスにおける現在位置にあるディレクトリは、 「。」です。直上のディレクトリは 「…」そして、さらに上昇する可能性もあります。絶対的な基準として、Windowsを例に挙げると、 「C:/User/USER/…」 このような構成になります。ファイルのパスが間違っている場合、ファイルを開けないという状況が予想以上に多く発生するため、十分な練習が必要です。


ファイルを開いたので、次は読み込んだり、書き込んだりする必要があります。

line = file.readline()
lines = file.readlines()
print(line, end="")
결과 출력 ==> '안녕하세요.'
print(lines)
결과 출력 ==> ['안녕하세요.\n', '파일을 읽고 있습니다.\n']

まず、ファイルを読み込む際に使用される関数は、主に以下のものがあります。 readline()readlines() の機能これを利用します。上記の例からわかるように、`readline()`はテキストファイルを1行ずつ読み込みます。`readlines()`は、すべての内容を1行ずつリストに格納します。重要な点は、ファイルを開く際に`open()`関数を使用することです。 改行 属性を指定することができます。もし指定しない場合は、デフォルトで… (改行) 改行がデフォルト値です。そのため、`lines`変数を出力すると、それぞれ`\n`という改行文字が出力されます。 脱出文字その内部構造が見える。


※ 補足: readline()、readlines() 関数は、open() 関数を使ってファイルを1行ずつ読み込む方法について 検索する(省略) tell() 上記のような関数に関連する 成長して この概念を理解することが望ましいです。整理された質の高い文章が多数存在するので、参考にしてください。


text1 = '안녕하세요.' + "\n"
text2 = '이번엔 파일을 작성해볼거에요.' + "\n"
file.write(text1)
file.write(text2)

text_list = ['안녕하세요.\n', '이번엔 파일을 작성해볼거에요.\n', '우와, 리스트로 작성하네요.\n']
file.writelines(text_list)

ファイルを保存する時 write() 関数と writelines() 関数 関数を使用します。特に、`text1` と `text2` の変数には、改行のエスケープ文字を追加しています。ファイルに書き込む際には、エスケープ文字を使って改行を明示的に指定する必要があります。 `write()` 関数は文字列を作成しますが、(省略) writelines()も、readlines()と同様に、文字列のリストを生成します。これらの情報を一度にまとめて提供できます。状況に応じてどちらも活用できるため、両方を理解しておくことが重要です。


※ 役立つヒント ファイルを開く際に、存在しないファイルであるにも関わらず、どのように開けば良いのか疑問に思うことがあるかもしれません。 `open()` 関数でファイルを書き込む際に指定するパスとファイル名は、私が自分で作成したファイル名です。 保存したい場所とファイル名この情報を入力します。もし、そのファイル場所に同じファイル名が存在する場合は 覆いかぶせる 注意が必要です!🥲


ファイルが読み込まれたり書き込まれたりしたので、開いたファイルを再度閉じる必要があります。閉じないと、open()関数で返されたファイルハンドルがメモリ上に残って、 계속 存在し続けることになります。 メモリの漏れこれにより、速度の低下を引き起こす可能性があります。速度低下の原因となるため、ファイルを閉じる際には「file.close()」を実行してください。

with open('경로와 파일명', '읽기, 쓰기 모드', '인코딩') as f :
    f.readline(), f.readlines()
    f.write(), f.writelines()

ファイルを開いたり閉じたりすることは、予想以上に手間がかかる場合があります。また、コードを長く記述していると、閉じ処理を忘れてしまうこともあります。そのため、これらの作業を簡単にまとめて行うためのキーワードがあります。それは 「~とともに」ただし、上記の例のように、`open()` 関数に「with」キーワードを付けて、関数のように使用することができます。 コロンを付けて、その中にどのような動作を行うかを記述してください。特に… 「~のように」`open()` 関数を個別に使用する場合、「as」を関数名の後に付け加えることで、ファイルハンドラをファイル変数に受け取るような形で、その名前を使ってファイル関連の関数を同じように使用できます。


ミッション:送信するメッセージを入力し、ファイルを暗号化して作成した後、作成されたファイルを復号化して確認する。

このミッションは、ファイルの読み書きの両方を学ぶのに役立つと考えています。今回は、具体的なコードを添付します。ゆっくりと練習されると良いでしょう。

#암호화 파일 생성
#메시지 입력
def inputText() :
	lines = []
	while True :
		text = input("메시지 입력 : ")
		if text == "" :
			break
		else :
			lines.append(text)

	return lines

#암호화 파일 생성
def fileCode() :
	lines = inputText()
	with open("C:\\Users\\user\\OneDrive\\바탕 화면\\code.txt", "w", encoding="utf-8") as f :
		for txt in lines :
			for tt in txt :
				ascii = ord(tt)
				
				if tt == ' ' :
					f.writelines(chr(ascii))
				else :
					ascii -= 30000
					f.writelines(chr(ascii))
			f.writelines("\n")

fileCode()

#해독한 파일 생성
#파일 불러오기
def callFile() :
	texts = []

	with open("C:\\Users\\user\\OneDrive\\바탕 화면\\code.txt", "r", encoding="utf-8") as f :
		while True :
			line = f.readline()
			if line == '' :
				break
			else :
				line = line.split('\n')[0]
				texts.append(line)

	return texts

#복호화
def descrambling() :
	lines = callFile()

	with open("C:\\Users\\user\\OneDrive\\바탕 화면\\des.txt", "w", encoding="utf-8") as f :
		for txt in lines :
			for tt in txt :
				ascii = ord(tt)
				
				if tt == ' ' :
					f.writelines(" ")
				else :
					ascii += 30000
					f.writelines(chr(ascii))
			f.writelines("\n")

descrambling()

※ 補足:パスに「\\」が2回出現するのは、この文字がエスケープ文字として認識され、正しいパスとして認識されないためです。そのため、もう一度「\\」を記述することで、エスケープ文字ではなく、パスで使用される文字であることを示しています。


今回の授業で苦労したタスクも共有します。これは、後で学習するネットワークやLinuxで使用するサーバーの設定ファイルを自動化するものです。まだその概念が明確でなく、適切なルールを見つけることができず、ロジックを構築しました。一度試してみる価値があると思うので、共有します。


以下の2つの設定ファイルがあります。

#다음은 setup.cfg 파일의 설정임

#WEB config
LISTEN : 8001;
SERVER_NAME : www.myserver.com;
proxy_pass : http://1.2.3.4:8080;

#WAS config
DB...

#server.cfg설정 파일
server {
	listen	80;
	server_name	localhost;
	
	location / {
		root /usr/share/nginx/html;
		index index.html index.html;
	}
}

目的:setup.cfgファイルから、listen、server_name、proxy_passなどの属性と、それぞれの設定値を読み込み、保存する。その後、server.cfgファイルから、対応する属性に合わせて値を変更する。例えば、listenの値を80から8001に変更する。setup.cfgファイルに記述された属性がない場合は、「location / {}」という設定の中に含める。

#config파일경로
def configPath() :
	path = input("경로 : ")
	return path

#config 파일 불러오기
def config(path) :
	path = path + "\\setup.cfg"
	cfg = {}
	with open(path, "r", encoding="utf-8") as f :
		while True :
			#데이터 가공 key, value로 구분(ex. 'LISTEN_PORT : 8001;\n'에서 마지막 ';\n'빼고)
			#":"기준으로 split 후 'LISTEN_PORT'는 key, '8001'은 value
			line = f.readline()

			if line.count(":") > 0 :
				index = line.find("\n")
				line = line[:index]
				idx = line.find(":")
				key = line[:idx].lower().strip()
				value = line[idx+1:].lower().strip()

				cfg[key] = value

			if line == "" :
				break
	print("불러오기 성공")
	return cfg

#server.cfg 파일 불러오기
def server(path, cfg) :
	path = path + "\\server.cfg"
	keyList = list(cfg.keys())

	with open(path, "r+", encoding="utf-8") as f :
		lines = f.readlines()

		for i in range(len(lines)) :
			for key in keyList :
				if lines[i].lower().find(key.lower()) >= 0 :
					line = lines[i].split("\t")
					line[-1] = cfg[key] + "\n"
					chgLine = "\t".join(line)
					lines[i] = chgLine
					keyList.remove(key)
				elif lines[i].lower().find(key.lower()) < 0 :
					line = lines[i].split("\t")

					if 'location / {\n' in line :
						newLine = ['\t', key, cfg[key]+"\n"]
						chgLine = "\t".join(newLine)
						lines.insert(i+1, chgLine)

		#파일의 맨 처음으로 커서이동
		f.seek(0, 0)
		#파일의 전체 내용 새로 쓰기
		f.writelines(lines)
		
	print("변환 성공")

#main
def main() :
	path = configPath()
	cfg = config(path)
	server(path, cfg)

main()

これは、さらに改善の余地があると思われるコードの例です。より良いコードを作成できると期待しています。



Ⅲ. Pythonクラス

クラスに関する記事を作成する前に オブジェクト指向プログラミングこれは、複数の書籍で解説する必要があるほど、非常に重要で難しく、内容も膨大です。今回の記事では、全てを網羅することはできません。そのため、概要や入門書として読んでいただけると幸いです。


まず、 対象物これは、プログラミングの文脈で、様々なものを指す言葉です。「物」とは、文字通り 人間になることも、車、動物、スマートフォン、タブレットなど、様々なものになることも可能です。 どのような 特性行為人間は手や足を持ち、歩いたり、食べたり、寝たりすることができます。同様に、車は車輪、エンジン、バッテリーを持ち、前に進んだり、後ろに退いたり、音楽を再生したりすることができます。この場合、人間と車はオブジェクトであり、手や足、車輪、エンジン、バッテリーは属性であり、歩く、食べる、寝る、進む、退く、音楽を再生することは動作となります。


Pythonでは、すでに作成済みのオブジェクトを利用できるようにします。Pythonの 文字列それは一つのオブジェクトとして 「文字」という属性に対する、find(), lower(), upper() などの操作これらはすべてオブジェクトのメソッドであり、よく使われる `len()` 関数もその一つです。


※ 補足:メソッドは、関数や動作と考える方が、理解しやすいかもしれません。


このクラスは、ある種の… 設計図しかし、私が作りたいものは… オブジェクトのプロパティは、メンバー変数で、操作はメソッドで定義されます。これらのデータは、プログラムで活用することができます。

class 클래스명 :
    #멤버 변수
    def 메소드명 :
    def __init__(self) :
        #생성자

このように宣言し、定義する。

class car :
    car_name = '자동차'

    def __init__(self, car_name) :
        self.car_name = car_name

    def go(self) :
        print(self.car_name + '가 앞으로 간다.')

具体的な例として、自動車クラスを想定します。この場合、「自動車」という名前は、クラスの属性であり、メンバー変数として扱われます。メソッドで go() この関数は、自動車が前進する動作を表しています。


※ 役立つヒント __init__() メソドは、生成関数です。 オブジェクトが作成された直後に、必ず呼び出される。 コンストラクタは、クラスがどのようなオブジェクトであるかを明確にする役割があります。また、コンストラクタは、引数としてメンバー変数の値を指定することで、初期化を行うことができます。コンストラクタについて理解するために。 「製品のライフサイクル」これについて理解しておくと役立ちます。関連する情報が豊富にあります。 必ず、絶対に ぜひ調べてみてください。


genesis = car('제네시스')
genesis.go()
출력 결과 ==> '제네시스가 앞으로 간다.'

クラスを作成し、使用する際、通常、以下のような構造を持ちます。クラスに合わせて変数名を宣言し、クラスが引数を持つコンストラクタを持つ場合は、引数を指定します。もしコンストラクタに引数がない場合は、省略しても構いません。その後、これらの変数名を使ってクラスのメソッドを呼び出すことで、プログラムのロジックを構築できます。


__init__()メソッドとは、クラスのインスタンスが作成される際に自動的に実行される特別なメソッドです。これは、オブジェクトの初期化を行うために使用されます。逆に、このメソッドとは逆の動作をするメソッドは存在しません。 __del__() 特定のメソッドが存在し、そのメソッドが使われなくなったら、そのメソッドを削除する機能です。クラスが宣言され、定義され、使用されると、メモリ空間に割り当てられます。プログラムを作成する過程で、多くのクラスが使用されます。メモリ空間を効率的に管理するために、Javaなどの言語では ガベージコレクション「クラスが不要になった時点で自動的に削除される」という仕組みがあり、Pythonでも同様の機能があります。そのため、個別に `__del__()` メソッドを作成する必要はありません。


特異な方法 __add__() このメソッドにより、以前はリストでの加算や乗算も可能でしたが、オブジェクトに対しても加算が可能になりました。

class car :
    car_name = ''
    def __add__(self, other) :
        print("객체", self.car_name, "과", other.car_name, "가 친구가 되었습니다.")

genesis = car()
genesis.car_name = "제네시스"
k3 = car()
k3.car_name = "K3"

genesis + k3
출력 결과 ==> 객체 제네시스 와 K3 가 친구가 되었습니다.

上記のような例を参考に 2つのオブジェクト(クラス)これにより、同じ種類のオブジェクトをまとめて利用できるようになります。「ジェネシス」と「K3」を個別に定義するように、生成子以外のクラスも メンバー変数に直接アクセスすることは可能ですが、推奨されません。 メンバー変数に直接アクセスすると、クラスを使用する際にコードが長くなり、保守が難しくなります。オブジェクトを使用する重要な理由の一つは データの保護、内部構造(実装)の保護~のために 「カプセル化」しかし、これは設計上の問題であり、オブジェクトの内部構造を外部に公開してしまう可能性があります。


実際、その次は クラスの継承、オブジェクトの主要な4つの特性(継承、抽象化、多態性、カプセル化) 理解すべき概念は多岐にわたるため、全てを網羅することは難しく、時間がかかる可能性もあります。そのため、継続的に学習を進め、関連する質の高い情報源を見つけて学習することを推奨します。



おまけ

徐々に難しくなっていくPythonを勉強しました。特に、以前のリスト、タプル、辞書、関数もすべて必須で、これらを理解していれば何かを作成できますが、プログラミングをより高度なレベルに高めるのは、クラスを使うことで実現できます。オブジェクト指向プログラミングの概念は、以前よりも理解が深まり、より多くの場面で活用できるようになったと感じて、とても満足しています。今後はネットワークとLinuxを学ぶ予定ですが、さらに努力して、より高度なプログラミングができるようになりたいです。😄