百度飞桨领航团零基础Python速成营 课程总结6

百度飞桨领航团零基础Python速成营 课程总结6

课程链接 https://aistudio.baidu.com/aistudio/course/introduce/7073
飞桨官网 https://www.paddlepaddle.org.cn/
推荐学习网站 https://www.runoob.com/python3/python3-tutorial.html


目录

课节6:文件操作及常用模块使用

  • 输入,处理,输出。

    输入:读取4个队员的训练数据,读取4个文件

    james.txt 2-34,3:21,2,34,2.45,3.01,2:01,2:01,3:10,2-22
    
    sarah.txt 2:58,2.58,2:39,2-25,2:55,2:54,2.18,2:55,2:55
    
    julie.txt 2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
    
    mikey.txt 2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
    

    处理:标准化数据,切分数据,top3(最快的3个时间)

    输出:将每个人的信息打印在屏幕上显示

文件处理模型

# 读取每行数据
f = open('work/train_data_cor.txt')
for line in f:
    print(line)
f.close()

输出:

james,2004-5-21,2.34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22

julie,2006-5-9,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21

sarah,2004-3-8,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55

mikey,2003-9-10,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38

例1. 数据出现问题

f = open('work/train_data_wrg.txt')
for line in f:
    data = line.strip().split(',')

    print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))
f.close()

输出:

recent call last)<ipython-input-4-a51a9349f79f> in <module>
      3     data = line.strip().split(',')
      4 
----> 5     print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))
      6 f.close()
IndexError: pop from empty list

解决方法:
1.使用异常

#使用异常
with open('work/train_data_wrg.txt') as f:
    for line in f:
        data = line.strip().split(',')
        try:
            print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))
        except:
            pass

2.代码判断

#代码判断
with open('work/train_data_wrg.txt') as f:
    for line in f:
        data = line.strip().split(',')
        if len(data) != 1:
            print('姓名:'+data.pop(0)+'生日:'+data.pop(0)+'时间:'+str(data))

正确输出:

姓名:james生日:2004-5-21时间:['2.34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']
姓名:julie生日:2006-5-9时间:['2.59', '2.11', '2:11', '2:23', '3-10', '2-23', '3:10', '3.21', '3-21']
姓名:sarah生日:2004-3-8时间:['2:58', '2.58', '2:39', '2-25', '2-55', '2:54', '2.18', '2:55', '2:55']
姓名:mikey生日:2003-9-10时间:['2:22', '3.01', '3:01', '3.02', '3:02', '3.02', '3:22', '2.49', '2:38']

文件常用函数

文件打开关闭:

  • open() 函数:打开文件。file object = open(file_name [, access_mode][, buffering])
  • close() 函数:关闭文件。fileObject.close()

文件读写

  • read() 函数:用于从文件读取指定的字节数。fileObject.read([size])
    参数size:从文件中读取的字节数,默认为 -1,表示读取整个文件。
  • readline() 函数:用于从文件读取整行,包括 “\n” 字符。fileObject.readline(size)
  • write() 函数:将任何字符串写入一个打开的文件。fileObject.write(string)

文件定位:

  • seek() 函数:用于移动文件读取指针到指定位置。fileObject.seek(offset[, whence])
    参数offset:开始的偏移量,也就是代表需要移动偏移的字节数。whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
  • tell() 函数: 返回文件的当前位置,即文件指针当前位置。fileObject.tell()

JSON(JavaScript Object Notation)

导入 json 库:import json
json()函数:

  • json.dumps 将 Python 对象编码成 JSON 字符串。
  • json.loads 将已编码的 JSON 字符串解码为 Python 对象。
  • json.dump 将数据写入json文件中。
  • json.load 把文件打开,并把字符串变换为数据类型。
  • 不带s的用于操作文件,带s的用于数据类型的转换。

表1. python 类型 json 类型转化对照表

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null
# dumps,python字典转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)
   
# dumps数据转化
ath_json = json.dumps(ath.__dict__)
# 字典
print(ath.__dict__)
# json 字符串
print(ath_json)

输出:

<__main__.Athlete object at 0x7f19d5064dd0>
{'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']}
{"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"]}
# dump,保存json到文件
with open('work/json.txt','w') as f:
   json.dump(ath_json,f)
# load,读取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文件/目录

  • os.getcwd() 函数:用于返回当前工作目录。
  • os.chdir() 函数:用于改变当前工作目录到指定的路径。os.chdir(path)
  • os.mkdir() 函数:用于以数字权限模式创建目录。默认的模式为 0777 (八进制)。os.mkdir(path[, mode])
  • os.listdir(path) 函数:返回path指定的文件夹包含的文件或文件夹的名字的列表。
  • os.system() 函数:将字符串转化成命令在服务器上运行。
    path模块:from pathlib import Path
  • os.path.abspath(path) 函数:返回绝对路径。
  • os.path.exists(path) 函数:如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。
  • os.path.dirname(path) 函数:返回文件路径。
  • os.path.isdir(path) 函数:判断路径是否为目录。
  • os.path.isfile(path) 函数:判断路径是否为文件。
import os
#返回当前工作目录
current_path = os.getcwd()
print('当前路径:'+current_path)

输出:

当前路径:/home/aistudio
#改变当前工作目录
os.chdir('/home/aistudio/work')
#运行mkdir命令
os.system('mkdir today')

输出:

0
from pathlib import Path
#返回当前绝对路径
abs_path = os.path.abspath('')
print('abs_path:'+abs_path)
#路径是否存在
Path(abs_path).exists()

输出:

abs_path:/home/aistudio/work
True
print('当前路径:'+os.getcwd())
listdir = os.listdir()
#返回当前路径下文件和文件夹名
print(listdir)

输出:

当前路径:/home/aistudio/work
['json.txt', 'train_data_cor.txt', 'athlete.py', 'data.txt', 'train_data_wrg.txt', 'today']
#是否为文件夹
os.path.isdir('/home/aistudio/work/today')

输出:

True

例1. 输出路径下所有txt文件的文件名

 # 输出路径下所有txt文件的文件名
import os

def recur(path):
    listdir = os.listdir(path)
    for name in listdir:
        next_path = path+'/'+name
        if name[0] is '.' or name[0] is '_':
            continue
        
        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)

path = '/home/aistudio/work'
target = []
recur(path)
print(target)

输出:

['loren.txt', 'json.txt', 'train_data_cor.txt', 'data.txt', 'train_data_wrg.txt']

多线程

  • 线程模块:thread和threading
  • run() 函数:不启动一个新线程,在主线程中调用了一个普通函数。
  • start() 函数:启动一个子线程,线程名就是自己定义的name。
  • join([time]): 等待至线程中止。

例1. 压缩文件:

#制造数据
with open('work/loren.txt','w+') as f:
  for i in range(50000):
      f.write('loren,2011-11-3,270,3.59,4.11,3:11,3:23,4-10,3-23,4:10,4.21,4-21')
      f.write('\n')
#使用进程的方式
import zipfile

print('压缩作业开始了,请您耐心等待...')

infile = 'work/loren.txt'
outfile = 'work/myarchive.zip'
f = zipfile.ZipFile(outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(infile)
f.close()

print('压缩作业结束了,请问还需要帮您做什么呢?')

输出:

压缩作业开始了,请您耐心等待...
压缩作业结束了,请问还需要帮您做什么呢?
import threading, zipfile

class AsyncZip(threading.Thread): #继承父类threading.Thread
  def __init__(self, infile, outfile):
      threading.Thread.__init__(self)
      self.infile = infile
      self.outfile = outfile

  def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
      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()

输出:

压缩作业开始了,请您耐心等待...
我正在为您压缩,请问还需要帮您做什么呢?
压缩完成,您要的文件在: work/myarchive.zip

作业六:大作业

作业内容:

第一题

数据如下:

stu1.txt 孙同学,2020-5-21,20,‘男’,77,56,77,76,92,58,-91,84,69,-91
stu2.txt 赵同学,2020-11-3,24,‘女’,65,68,72,95,-81,71,86,91,57,91
stu3.txt 王同学,2021-8-7,25,‘男’,87,78,90,-76,88,47,100,65,69,100
stu4.txt 李同学,2021-8-10,29,‘男’,92,54,85,71,-91,68,77,68,95,95
以上四个txt文档在work路径下可以找到。

定义Student类,包括name、dob、age、gender和score属性,包括top3方法用来返回学生的最大的3个成绩(可重复)、sanitize方法用来将负的分数变为正的分数,负的分数可能是输入错误。声明stu_list对象组数用于存储所有的学生对象。最后输出所有的学生信息包括姓名、生日、年龄、性别、最高的3个分数。

第一题的输出结果如下,供参考:
输出参考结果

# 定义类
class Student():
    def __init__(self, name, dob, age, gender, score=[]):
        self.name = name
        self.dob = dob
        self.age = age
        self.gender = gender
        self.score = score
    def __str__(self):
        return "姓名:%s  生日:%s 年龄: %s 性别: %s 分数:%s"%(self.name,self.dob,self.age,self.gender,self.top3())
    def top3(self):
        return sorted([self.sanitize(s) for s in self.score])[-3:]
    def sanitize(self,s):
        abs(s)
        return (s) 
            
# 读取文件
def readfile(Path):
    with open(Path) as f:
        for line in f:
            data = line.strip().split(',')
            return data

# 列表初始化
pathlist = ['work/stu1.txt', 'work/stu2.txt', 'work/stu3.txt', 'work/stu4.txt']
stu_list = []

# 读入创建对象
for i in pathlist:
    res = readfile(i)
    stu_list.append(Student(res[0],res[1],res[2],res[3],[int(i) for i in res[4:]]))
for i in stu_list:
    print(i)

输出:

姓名:孙同学  生日:2020-5-21 年龄: 20 性别: '男' 分数:[77, 84, 92]
姓名:赵同学  生日:2020-11-3 年龄: 24 性别: '女' 分数:[91, 91, 95]
姓名:王同学  生日:2021-8-7 年龄: 25 性别: '男' 分数:[90, 100, 100]
姓名:李同学  生日:2021-8-10 年龄: 29 性别: '男' 分数:[92, 95, 95]

第二题

数据格式如下:

stu5.txt 特长同学,2020-10-5,20,‘男’,180,87,98,77,76,92,58,-76,84,69,-47
stu6.txt 特长同学,2020-10-6,20,‘女’,230,76,48,82,88,92,58,-91,84,69,-68
以上两个txt文档在work路径下可以找到。

定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。

第二题的输出结果如下,供参考:
输出参考结果

# 继承
class Spostudent(Student):
    def __init__(self,name,dob,age,gender,spe,score=[]):
        self.spe = spe
        Student.__init__(self,name,dob,age,gender,score)
    def __str__(self):
        return "姓名:%s  生日:%s 年龄: %s 性别: %s 分数:%s 特长分:%s"%(self.name,self.dob,self.age,self.gender,self.top3(), self.spe)    
    def top3(self):
        return sorted([self.sanitize(s) for s in self.score])[0:3]
        
class Artstudent(Student):
    def __init__(self,name,dob,age,gender,spe,score=[]):
        self.spe = spe
        Student.__init__(self,name,dob,age,gender,score)
        
    def __str__(self):
        return "姓名:%s  生日:%s 年龄: %s 性别: %s 分数:%s 特长分:%s"%(self.name,self.dob,self.age,self.gender,self.top3(), self.spe)
    # 最高的3个得分
    def top3(self):
        return sorted([self.sanitize(s) for s in self.score])[-3:]
spo = 'work/stu5.txt'
art = 'work/stu6.txt'

# 读取对象
res = readFile(spo)
spo = Spostudent(res[0],res[1],res[2],res[3],res[4],[int(i) for i in res[5:]])
print(spo)
res = readFile(art)
art = Artstudent(res[0],res[1],res[2],res[3],res[4],[int(i) for i in res[5:]])
print(art) 

输出:

姓名:特长同学  生日:2020-10-5 年龄: 20 性别: '男' 分数:[-91, -91, 56] 特长分:180
姓名:特长同学  生日:2020-10-6 年龄: 20 性别: '女' 分数:[77, 84, 92] 特长分:230

sanitize(s) for s in self.score])[-3:]
spo = ‘work/stu5.txt’
art = ‘work/stu6.txt’

读取对象

res = readFile(spo)
spo = Spostudent(res[0],res[1],res[2],res[3],res[4],[int(i) for i in res[5:]])
print(spo)
res = readFile(art)
art = Artstudent(res[0],res[1],res[2],res[3],res[4],[int(i) for i in res[5:]])
print(art)

输出:

姓名:特长同学 生日:2020-10-5 年龄: 20 性别: ‘男’ 分数:[-91, -91, 56] 特长分:180
姓名:特长同学 生日:2020-10-6 年龄: 20 性别: ‘女’ 分数:[77, 84, 92] 特长分:230

上一篇:在easyui-tabs中的href或 content的多种条件下的不同页面内容和页面地址的赋值?


下一篇:tomcat各目录的作用