WeSeong 登录
← 返回文章列表
编程语言

Python 文件读写、类

Python 文件读写、类

Python 相关帖子可能会继续,但现在,我们先继续吧。 网络或 Linux 相关文章将很快发布。 Python 只有四个相关帖子,但事实上,这四个帖子 Python不可能理解一切。 由于我发布的每篇文章中甚至只有一个副标题就能引发足够多的讨论来填满几篇文章,所以我认为你可以将我迄今为止写的文章视为一个总结或介绍。或者,你可以将它们视为“这是你应该学习的顺序”。所以,我们开始吧!🙃


一、概述

Python 允许您导入或创建 文件。读取和写入文件比您想象的更重要,并且可以用于各种方式。读取或写入文件时使用的函数是 open()。读取文件时,使用 readline(), readlines()。写入文件时,使用 write(), writelines()。面向对象编程的核心概念是 类 这个概念。Python 也以类的形式创建对象,具有 属性 和 类是基于 操作编写的。一个类由 成员变量 和 方法 组成。类具有 生命周期,包括创建、运行和销毁。一个类的特殊方法包括 __del__() 和 __add__().一个类可以 继承 另一个类,其中继承指的是父类和子类之间的关系,类似于汽车轮子属于汽车。


内置函数



二、读取和写入 Python 文件

为什么要读取和写入文件? Python你可能会想知道他是怎么知道的。 但是读取和写入文件 在编程中,它的重要性比你想象的要高。 例如,在处理 Web 项目时,您可能需要导入大量数据并将其存储在数据库中。 Python使用 Excel 的自动化是著名的,自动化过程中接收的输入会生成文件或 Excel、韩文或其他格式。 PDF, 在加载和利用文本文件等时,使用的两个函数是文件读取和写入。当然,并不是所有上述示例都可以使用本文中提到的内容。对于文件读取和写入,有许多函数可供使用。 图书馆如果您对文件读取和写入有基本了解,我建议您也研究其他库! 😊


※ TIP:如果使用 Linux类似的 CLI(Command-Line Interface),文件读写更为重要。Linux是一种操作系统,用于利用云服务,而CLI仅仅是以文本形式传输数据并运行程序,因此可以以文本形式读写文件并创建自动化程序。Windows类似 GUI(Graphical User Interface)可以通过鼠标和键盘轻松使用。这要归功于图形元素,而CLI默认情况下不使用图形元素。当使用图形元素时,需要许多 资源(Resource),并消耗内存。 管理变得非常重要,因此熟悉文件读取和写入是很有必要的。


文件通过 三个步骤进行读取和写入。首先打开文件,然后读取或写入文件,最后关闭文件。

首先,打开文件的过程是读取或写入时的一个重要步骤。 open() 使用函数 open() 功能 return用 文件处理程序在这种情况下,文件无法立即读取或写入,但如果正常工作,则处于直接使用之前的状态。

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

open() 函数的参数更加多样化,但基本上上述示例中的参数是最常用的。这里,path是很重要的,并且由于路径而可能会遇到许多错误。'读模式'可以写成 'r',而'写模式'则写成 'w'.还有更多样化的模式,因此学习和了解更多是很有必要的。编码(字符集)元素不是必需的,但可能会根据文件的编码导致韩文字符被破坏。了解ASCII 码、Unicode的概念是很有必要的。 由于有许多帖子,我们建议您进行搜索。我们通常使用的编码是 'utf-8'。


※ TIP: 路径为 相对路径和 绝对路径. 相对路径从当前目录中查找文件,绝对路径从根目录中查找文件。在相对路径中,当前目录为 '.\',父目录为 '..\',可以继续。在 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 允许我们使用已经创建的对象。Python 中的 string 具有一个名为 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'按照单独定义,除了构造函数外,一个类还包括 不建议直接访问成员变量。 直接访问成员变量会使代码变得更长,在使用该类时更难以维护。使用对象的重要原因之一就是 数据、内部结构(实现)保护为 '胶囊'但是,这种情况被违反了,对象内部的逻辑可以被外部暴露。


实际上,还有许多概念需要理解,例如类的继承,对象的四大特性(继承、抽象、多态、封装)。不可能全部涵盖,而且可能需要很长时间,因此建议您继续学习,寻找相关的优质文章。



评论

变得越来越难 Python我研究了它,尤其是最后一章。 列表或 元组, 字典、函数甚至类都是编程中必不可少的内容,虽然你可以用它们创建一些东西,但使编程变得高级的却是类。我记得曾经查阅过大量关于面向对象编程的资料,因为我当时并不真正理解它。现在我仍然没有完全理解它,但我很自豪地说,我能用它比以前更多。未来,我将能够越来越多地使用它。 Linux我期待着研究它,我认为我还要更加努力。 😄