首页 AI Studio教育版 帖子详情
Python笔记 06(完)
收藏
快速回复
AI Studio教育版 文章课程答疑 698 2
Python笔记 06(完)
收藏
快速回复
AI Studio教育版 文章课程答疑 698 2

复制粘贴csdn的,csdn被给我发,难受。

 

> 前言:最后一节课了,上课内容有点偏课外补充。前3节课是语法基础,后2节是类、对象的重点运用,最后一节就补充一些知识。


@[TOC](目录)


———————————————
# 《百度飞桨领航团零基础Python速成营》 课程笔记 —— 06(完)


## 一、文件操作 - open


> [菜鸟教程 - Python open() 函数](https://www.runoob.com/python/python-func-open.html)(内含 file 对象方法)
> https://www.runoob.com/python/python-func-open.html


### 1)创建 file 对象
- 前几节课就有用到,这节课详细说明了一下。
- 使用`with`可以不需要`close`关闭文件。(使用飞桨平台时,也需要用到这个关键字,死活不能理解。感觉和这里的用法不属一类。)
```python
# 麻烦的旧方法:
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。


```python
f = open('work/train_data_cor.txt')
for line in f:
    print(line)
f.close()
```
### 2)file 对象方法


```python
# 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#中,不会用异常处理,都是用判断解决的。


```python
#使用异常
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)
> https://www.runoob.com/python/python-json.html
### 1)对象转JSON
- 从代码上看,只需要把json作为父类继承就可以使用了。子类也不用写其他相关的东西,使用起来很方便。相当于继承之后,就在子类加入了些数据描述的方法和属性了。然后调用即可。


```python
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>`提示是类对象的信息。
- 实际上是一段字符串,因为打印出来了,看起来像字典,如果把这段内容保存在文件中,再打开文件查看时就发现,其实是字符串的格式写的字典样式(用到了转义字符)。
```python
# 类中的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)
> https://www.runoob.com/python/os-file-methods.html
- 这部分主要介绍了os模块的使用场景,了解一下。实战中常会用到创建或查找本地目录,用于加载数据。


### 1)os.getcwd() - 返回当前工作目录
```python
import os
#返回当前工作目录
current_path = os.getcwd()
print('当前路径:'+current_path)
# 输出:当前路径:/home/aistudio
```


### 2)os.chdir() - 改变当前工作目录
```python
#改变当前工作目录
os.chdir('/home/aistudio/work')
#运行mkdir命令
os.system('mkdir today')
# 输出:256
```


### 3)os.path.abspath()  - 返回当前绝对路径/ Path().exists() - 路径是否存在
```python
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() - 返回当前路径下文件和文件夹名
```python
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() - 是否为文件夹
```python
#是否为文件夹
os.path.isdir('/home/aistudio/work/today')
# 输出:True
```


### 4)例子&问题
> 问题1:显示work路径下的所有类型为txt的文件
> 问题2:temp = name.split('.')在name为dir1时出现问题


```python
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个问题,从而引出**递归**概念。
- 之前入门时有听过这个概念,说简单点就是自己调用自己。嵌套调用。
- 需要注意的就是返回值,这里的返回值不需要接收,所以就不考虑。 


```python
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)
> https://aistudio.baidu.com/aistudio/projectdetail/69987?channelType=0&channel=0&qq-pf-to=pcqq.group


- 又一个扩展,是属于`Notebook`的一个调试功能。平时嵌入式调试得多了,所以很熟系。
- 只是把IDE的图像界面的调试功能,使用指令再现了,了解指令后就会用了。


## 五、线程 & 进程
- 没什么好讲的,一个就是单路直走,一个就是多路同时走。电脑玩多了应该都有概念了。
- 使用模块调用就可以了,下面是代码例子,更多信息自查。


```python
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()
```

 

0
收藏
回复
全部评论(2)
时间顺序
什么都不懂的人
#2 回复于2021-02

加油,慢慢学,fighting

 

0
回复
AIStudio810258
#3 回复于2021-02

厉害厉害,加油,共同进步!

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户