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

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

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

Python 関連する投稿は続きますが、とりあえずはこのまま進めましょう。 ネットワークまたは Linux 関連記事は近日中に公開します。 Python 関連する投稿はわずか4件ですが、実際にはこれら4件の投稿 Pythonすべてを理解することは不可能です。 私の投稿の一つのサブヘッディングだけでも、多くの議論の対象となることがあるので、これまでに投稿した投稿は、要約や紹介と考えることができます。あるいは、「この順番で勉強すれば、できるようになるだろう」と考えることもできます。では、さっそく始めましょう!🙃


Ⅰ. 概要

Python では、ファイルをインポートしたり作成したりできます。ファイルの読み取りと書き込みは、思ったよりも重要で、さまざまな方法で利用できます。ファイルを読み取るときや書き込むときに使用される関数は、open()です。ファイルを読み取るときは、readline(), readlines()を使用します。ファイルを書き込むときは、write(), writelines()を使用します。オブジェクト指向プログラミングのコア概念はクラスです。Python では、属性を持つオブジェクトもクラスとして作成されます。 クラスはアクションに基づいてプログラムされます。クラスはメンバ変数とメソッドから構成されます。クラスには、作成、操作、破棄からなる「ライフサイクル」があります。クラスの特別なメソッドには__del__()と__add__()があります。クラスは別のクラスから継承することができます。継承とは、親クラスと子クラスの関係を表し、車のホイールが車に属するのと同じように、車輪が車に属することを表します。


組み込み関数



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

ファイルを読み書きするのはなぜですか? Python彼がそれをどうやって知ったのか不思議に思うかもしれません。 しかし、ファイルの読み書き これは、思ったよりもプログラミングにおいて重要です。 たとえば、Web プロジェクトを作業している場合、大量のデータをインポートしてデータベースに格納する必要がある場合があります。 PythonExcelを使用した自動化は有名ですが、自動化プロセス中に受信した入力はファイルやExcel、ハングルなどの形式で生成されます。 PDF, テキストファイルなどを読み込んだり利用する際に使われる機能は、ファイルの読み込みと書き込みです。もちろん、今回の記事で述べた内容だけで上記の例すべてを実現することはできません。ファイルの読み込みと書き込みに関する機能はたくさんあります。 図書館ファイルの読み書きについて基本的な知識があるなら、他のライブラリも勉強してみることをおすすめします!😊


※ TIP: Linuxのような CLI(Command-Line Interface)では、ファイルの読み書きがより重要です。Linuxはクラウドサービスを利用する際に使用されるオペレーティングシステムであり、CLIは単にテキスト形式のデータを転送し、プログラムを実行するため、テキスト形式のファイルを読み書きでき、自動化されたプログラムを作成できます。Windowsのような GUI(Graphical User Interface)は、マウスとキーボードを使用するユーザーでも簡単に使用できます。これはグラフィカルな要素があるためであり、CLIではデフォルトではグラフィカルな要素を使用しません。グラフィカルな要素を使用すると、多くの リソース(Resource)が必要となり、メモリが消費されます。 管理が非常に重要になりますので、ファイルの読み書きに慣れておくとよいでしょう。


ファイルは、3つのステップを経て読み書きされます。まず、ファイルを開きます。次に、ファイルを読み書きします。最後に、ファイルを閉じます。

まず、ファイルを開くプロセスは、読み取りまたは書き込みを行う際に欠かせない手順です。 open() 関数の使用 open() 機能 returnで ファイルハンドラーこの場合、ファイルはすぐに読み書きできませんが、通常機能している場合は直接使用される前の状態です。

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

open() 関数にはより多様な引数がありますが、基本的には上記の例の引数が広く使用されています。ここで pathは重要で、パスのために多くのエラーが発生する可能性があります。'読み取りモード'は'r'と表現でき、'書き込みモード'は'w'と表現されます。より多様なモードがありますので、研究して詳しく知るのが良いでしょう。エンコーディング (文字セット)は必須ではありませんが、ファイルのエンコーディングによっては韓国語の文字が壊れる可能性があります。ASCII コード、Unicodeの概念を知っておくと良いでしょう。 投稿が多いため、検索することをおすすめします。通常使用しているエンコーディングは 'utf-8'.


※ TIP: パスには相対パスと絶対パスの2種類があります。相対パスでは現在のディレクトリからファイルを探し、絶対パスではルートディレクトリからファイルを探します。相対パスでは現在のディレクトリは'、親ディレクトリは'..'であり、上への移動が可能です。Windowsでは、絶対パスは次のように構成されます:'C:/User/USER/····'。パスが正しくない場合、ファイルを開けないこともありますので、十分に練習することが重要です。


ファイルを開いたら、読み書きができるはずです。

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

ファイルを読み込むために使用される機能は主に readline()と readlines()上の例でご覧の通り、 readline()テキストファイルを一度に一行ずつ読み込みます。 readlines()すべてのコンテンツを一度に一行ずつ表示します リストここに置いておきましょう。重要なのは、ファイルを開いたときに open() 関数内 newline プロパティを指定することができますが、指定しない場合はデフォルト値が設定されます '\n' 改行はデフォルトです。 lines 変数が出力されるとき、それぞれに '\n' で行頭が切り替わります エスケープ文字それが含まれていることがわかります


※ TIP: readline(), readlines() すべての関数では、ファイルを一度に一行ずつ読み取る方法が示されています。 open() 機能 seek(), 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()ストリングのほか リスト両方を同時に作成することができます。状況によっては、両方を使用することもありますので、両方を知っておくことは良いことです。


※ TIP: ファイルがまだ存在していないときに、それがどのように開けることができるのか不思議に思うかもしれません。 open() ファイルを関数で書き出すときに使用されるパスとファイル名は、ファイルを作成する際に私が決定します。 保存する場所とファイル名ファイル名を入力します。同じ名前のファイルがその場所に既に存在している場合、 上書 気をつけなさい!🥲


ファイルを読み書きしたので、閉じる必要があります。閉じないと、 open() 機能別に return 受け取ったファイルハンドラーはメモリに割り当てられ、常駐します メモリ漏れこれにより、スローダウンが発生し、ファイルが閉じる際に予期せぬ閉じ方をすることがあります。file.close()'ただそれだけでいい。

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

ファイルの開きと閉じは面倒な作業ですが、長いコードを書いたときに閉じ忘れることもあります。そこで、両方を同時に簡単に行うことができるキーワードがあります: 'with'上の例と同様に open() 関数を「with」キーワードで前置する。これは、関数と同じです。 ':' コロンを追加した後、その中でどのようなアクションを行うかを指定できます。 'として f'見てみれば分かるよ。 open() 関数を個別に記述する場合 file ファイルハンドラーを変数に返したように、「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()

※ TIP: パス内で '\\' が二回出現するのは、エスケープ文字として認識されるため正しいパス指定ができないためです。これを一度さらに追加することで、パス内で使用する文字であることを表現しています。


今回の授業で難しかった課題も共有したいと思います。それは、後々ネットワークやLinuxで使うことになるサーバの設定ファイルを自動化するというものです。まだ概念が明確でないため、ルールをきちんと見つけられず、ロジックを設定することができませんでした。一度試してみるのも良いかもしれません。


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

#다음은 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 に属性がなければ、 'lcoation / {}'. の設定に追加します。

#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 クラス

クラスについて記述する前に オブジェクト指向プログラミングこれはとても重要で、難しく、長いものなので、説明するには数冊の本が必要です。この記事ではすべてを網羅することはできません。したがって、これは要約や紹介として考えてください。ぜひご一読ください。


まず第一に、 オブジェクト (Object)プログラミングの観点から、多数のオブジェクトを指す用語です。オブジェクトは文字通り それは人、車、動物、スマートフォン、タブレットなどさまざまなものです。 何 プロパティと アクション人間には手と足があり、歩く、食べる、寝るなどの行動をとる。車には車輪、エンジン、バッテリーがあり、前進、後退、音楽を再生するなどの行動をとる。ここで、人間と車は対象であり、手と足、車輪、エンジン、バッテリーは特性であり、歩く、食べる、寝る、前進する、後退する、音楽を再生するなどの行動は行為である。


Python では、すでに作成済みのオブジェクトを使用できます。string は、Python に characters という属性があり、find(), lower(), upper() などの操作が可能です。頻繁に使用する len() 関数も、オブジェクトのメソッドです。


※ TIP: メソッドを単純な関数やアクションとして考えると理解しやすいかもしれません。


クラスは一種のものです 図面しかし、私が作りたいのは オブジェクトのプロパティはメンバ変数として定義され、アクションはメソッドとして定義されます。そして、プログラムで使用できます。

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 + '가 앞으로 간다.')

たとえば、Car クラスがあると仮定すると、車の名前は属性でもメンバー変数でもあります。 go() 車が前進していることを表す機能があります。


※ TIP: __init__() このメソッドはコンストラクターです。 オブジェクトが作成されたときから無条件に呼び出されます。 コンストラクタは、メンバ変数の値をパラメータとして受け取り、それらを初期化することで、クラスがどのようなオブジェクトであるかを明確に示すことができます。を通じて はい。コンストラクターを知るには、 'ライフサイクル」理解するのは良いことです。このテーマに関する良い資料がたくさんあります。 絶対に必要 検索することをお勧めします。


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

クラスを作成し使用する場合、通常、次のような構造になります。クラスに従って変数名を宣言し、クラスにパラメータを持つコンストラクターがある場合は、そのパラメータを指定します。そうでない場合は省略することもできます。次に、プログラムのロジックを構築するために、これらの変数名を使用してクラスのメソッドを呼び出すことができます。


__init__() メソッドとは対照的です __del__() クラスが完全に使用され、もう必要ないときに呼び出されるメソッドです。クラスが宣言され、定義されたとき、メモリ領域が割り当てられます。プログラムを作成するにつれて、多くのクラスが使用されます。メモリ領域を効率的に管理するために、Java などの言語では、 Garbage Collection(ゴミ収集)クラスを自動的に破棄する方法があります。 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 가 친구가 되었습니다.

上の例と同様に 二つのオブジェクト(クラス)これらを追加することで、同じタイプのオブジェクトを一緒に使用できます。'Genesis' と 'K3'個別に定義される場合、クラスにはコンストラクタのほか、 メンバー変数に直接アクセスすることは推奨されません。 メンバ変数に直接アクセスすると、クラスを使用する際にコードが長くなり、メンテナンスが困難になります。オブジェクトを使用する重要な理由のひとつは、この点です。 データ、内部構造(実装)の保護のための 'カプセル」しかし、これは破られており、オブジェクト内部のロジックが外部に公開される可能性があります。


実際には、理解する必要がある概念がたくさんあります。たとえば、クラス継承、オブジェクトの4つの主要な特徴(継承、抽象化、多態性、カプセル化)などです。これらすべてを網羅することは不可能であり、長い時間がかかる可能性もあります。そのため、継続して勉強し、関連する良い記事を見つけることをお勧めします。



レビュー

ますます困難になっています Python私はそれを勉強しました、特に最後の章です。 リストまたは タプル, 辞書、関数、クラスなど、プログラミングには欠かせないものばかりです。これらを使って何かを作ることはできますが、プログラミングを高度にするのはクラスです。オブジェクト指向プログラミングについて、当時はまったく理解できなかったので、たくさんの情報を調べました。今でも完全には理解できていませんが、以前よりも使えるようになったと自負しています。今後は、ますます使いこなせるようになるでしょう。 Linux勉強するのが楽しみです。もっと頑張らなくてはならないと思います。😄