【AI Studio】Python 学习笔记 —— 06(完)

前言:最后一节课了,上课内容有点偏课外补充。前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()

猜你喜欢

转载自blog.csdn.net/Lovely_him/article/details/113780833
今日推荐