前言:最后一节课了,上课内容有点偏课外补充。前3节课是语法基础,后2节是类、对象的重点运用,最后一节就补充一些知识。
———————————————
【AI Studio】《零基础Python速成营》 课程笔记 —— 06(完)
依据:课程链接或个人博客
https://blog.csdn.net/Lovely_him?spm=1010.2135.3001.5343
一、文件操作 - open
菜鸟教程 - Python open() 函数(内含 file 对象方法)
https://www.runoob.com/python/python-func-open.html
1)创建 file 对象
- 前几节课就有用到,这节课详细说明了一下。
- 使用
with
可以不需要close
关闭文件。(使用飞桨平台时,也需要用到这个关键字,死活不能理解。感觉和这里的用法不属一类。)
# 麻烦的旧方法:
f = open('work/train_data_cor.txt')
line = f.readline()
f.close()
# 前几节课用过的:读取文件内容
def get_coach_data(filename):
with open(filename) as f:
line = f.readline() # 因为之前都是只读一行,所以没出现问题。
return line.strip()
# 注意这2个方法,名字只有一字只差
file.readline() # 返回一行。
file.readlines([size]) # 返回包含size行的列表, size 未指定则返回全部行。
- 有点有趣的说明一下:按照上面的代码理解的话,
open
的返回值f
应该是个类的对象,可以调用方法。但是下面的操作却表明f
是一个可迭代的数据(我的理解)。 - 老师说python里有这样的机制,
in
时相当于自动调用了readline
读取返回一行。(感觉言外之意就是不懂原理就死记)
在使用API时,也有很多这种情况,我完全不能理解明白“为什么能这样使用”啊。后来想到,就算是列表、集合等也有方法。老师也说过,Python中其实一切皆对象。再结合之前学的装饰器、高阶函数、生成器等概念。大概明白了一个道理 —— Python就是能这样用 —— 人生苦短,我用Python。
f = open('work/train_data_cor.txt')
for line in f:
print(line)
f.close()
2)file 对象方法
# size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。
file.read([size])
# 返回一行。
file.readline()
# 返回包含size行的列表, size 未指定则返回全部行。
file.readlines([size])
# 通过迭代器访问。
for line in f:
print line
# 如果要写入字符串以外的数据,先将他转换为字符串。
f.write("hello\n")
# 返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。
f.tell()
# 用来移动文件指针。
# 偏移量: 单位为字节,可正可负
# 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
f.seek(偏移量,[起始位置])
# 关闭文件
f.close()
一点五、异常处理 *
有两种解决办法:
1.使用异常跳过有问题的数据 2.增加代码判断
- 这一知识点也讲过了,这里再度巩固了解。在c#中,不会用异常处理,都是用判断解决的。
#使用异常
f = open('work/train_data_wrg.txt')
for line in f:
data = line.strip().split(',')
try:
print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))
except:
pass
f.close()
#代码判断
f = open('work/train_data_wrg.txt')#1
for line in f:#2
data = line.strip().split(',')
if len(data) != 1:
print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))
f.close()#3
二、JSON
菜鸟教程 - Python JSON
https://www.runoob.com/python/python-json.html
1)对象转JSON
- 从代码上看,只需要把json作为父类继承就可以使用了。子类也不用写其他相关的东西,使用起来很方便。相当于继承之后,就在子类加入了些数据描述的方法和属性了。然后调用即可。
import json
class Athlete(json.JSONEncoder):
def __init__(self,a_name,a_dob=None,a_times=[]):
self.name = a_name
self.dob = a_dob
self.times = a_times
def top3(self):
return sorted(set([self.sanitize(t) for t in self.times]))[0:3]
def sanitize(self,time_string):
if '-' in time_string:
splitter = '-'
elif ':' in time_string:
splitter = ':'
else:
return (time_string)
(mins,secs) = time_string.split(splitter)
return (mins+'.'+secs)
with open('work/train_data_cor.txt') as f:
data = f.readline().strip().split(',')
ath = Athlete(data.pop(0),data.pop(0),data)
print(ath)
ath_json = json.dumps(ath.__dict__)
print(ath_json)
# 输出:
# <__main__.Athlete object at 0x7faaa074fc50>
# {"name": "james", "dob": "2004-5-21", "times": ["2.34", "3:21", "2.34", "2.45", "3.01", "2:01", "2:01", "3:10", "2-22"]}
2)json数据
- 从上一点,可以看出,json数据的格式是字典样的。而且还返回了一个
<__main__.Athlete object at 0x7faaa074fc50>
提示是类对象的信息。 - 实际上是一段字符串,因为打印出来了,看起来像字典,如果把这段内容保存在文件中,再打开文件查看时就发现,其实是字符串的格式写的字典样式(用到了转义字符)。
# 类中的json形式的变量保存到文件
with open('work/json.txt','w') as f:
json.dump(ath_json,f)
# 文件内的内容:"{\"name\": \"james\", \"dob\": \"2004-5-21\", \"times\": [\"2.34\", \"3:21\", \"2.34\", \"2.45\", \"3.01\", \"2:01\", \"2:01\", \"3:10\", \"2-22\"]}"
# 读取json文件内容
with open('work/json.txt') as f:
ath = json.load(f)
print(ath)
# 输出:{"name": "james", "dob": "2004-5-21", "times": ["2.34", "3:21", "2.34", "2.45", "3.01", "2:01", "2:01", "3:10", "2-22"]}
三、目录访问 - os
菜鸟教程 - Python OS 文件/目录方法
https://www.runoob.com/python/os-file-methods.html
- 这部分主要介绍了os模块的使用场景,了解一下。实战中常会用到创建或查找本地目录,用于加载数据。
1)os.getcwd() - 返回当前工作目录
import os
#返回当前工作目录
current_path = os.getcwd()
print('当前路径:'+current_path)
# 输出:当前路径:/home/aistudio
2)os.chdir() - 改变当前工作目录
#改变当前工作目录
os.chdir('/home/aistudio/work')
#运行mkdir命令
os.system('mkdir today')
# 输出:256
3)os.path.abspath() - 返回当前绝对路径/ Path().exists() - 路径是否存在
from pathlib import Path
#返回当前绝对路径
abs_path = os.path.abspath('')
print('abs_path:'+abs_path)
#路径是否存在
Path(abs_path).exists()
# 输出:abs_path:/home/aistudio/work
# 输出:True
3)os.listdir() - 返回当前路径下文件和文件夹名
print('当前路径:'+os.getcwd())
listdir = os.listdir()
#返回当前路径下文件和文件夹名
print(listdir)
# 输出:
# 当前路径:/home/aistudio/work
# ['today', 'data.txt', 'train_data_wrg.txt', 'train_data_cor.txt', 'json.txt', 'athlete.py']
3)os.path.isdir() - 是否为文件夹
#是否为文件夹
os.path.isdir('/home/aistudio/work/today')
# 输出:True
4)例子&问题
问题1:显示work路径下的所有类型为txt的文件
问题2:temp = name.split(’.’)在name为dir1时出现问题
import os
path = '/home/aistudio/work'
listdir = os.listdir(path)
target = []
for name in listdir:
#防止文件名与文件夹名一样的情况
# print(os.path.isfile(name))
if os.path.isfile(path+'/'+name):
temp = name.split('.')
(filename,filetype) = (temp.pop(0),temp.pop(0))
if filetype == 'txt':
target.append(name)
# print('name:%s,type:%s' %(filename,filetype))
print(target)
四、递归
问题3:如果dir1中包含文件呢?
问题4:如果dir1中又包含文件夹该怎么办呢?
有重复的代码,我们就会想到循环
- 从上面的例子中,再衍生2个问题,从而引出递归概念。
- 之前入门时有听过这个概念,说简单点就是自己调用自己。嵌套调用。
- 需要注意的就是返回值,这里的返回值不需要接收,所以就不考虑。
import os
def recur(path):
listdir = os.listdir(path)
for name in listdir:
if name[0] is '.' or name[0] is '_':
continue
next_path = path+'/'+name
if os.path.isfile(next_path) :
# print(next_path + '=====isfile')
temp = name.split('.')
(filename,filetype) = (temp.pop(0),temp.pop(0))
if filetype == 'txt':
target.append(name)
else:
recur(next_path)
return os.path.dirname(next_path)
path = '/home/aistudio/work'
target = []
recur(path)
print(target)
四点五、调试 pdb 模块 *
AI Studio基本操作(二) Debug篇
https://aistudio.baidu.com/aistudio/projectdetail/69987?channelType=0&channel=0&qq-pf-to=pcqq.group
- 又一个扩展,是属于
Notebook
的一个调试功能。平时嵌入式调试得多了,所以很熟系。 - 只是把IDE的图像界面的调试功能,使用指令再现了,了解指令后就会用了。
五、线程 & 进程
- 没什么好讲的,一个就是单路直走,一个就是多路同时走。电脑玩多了应该都有概念了。
- 使用模块调用就可以了,下面是代码例子,更多信息自查。
import threading, zipfile
class AsyncZip(threading.Thread):
def __init__(self, infile, outfile):
threading.Thread.__init__(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
print('压缩完成,您要的文件在:', self.outfile)
background = AsyncZip('work/loren.txt', 'work/myarchive.zip')
print('压缩作业开始了,请您耐心等待...')
background.start()
print('我正在为您压缩,请问还需要帮您做什么呢?')
background.join()