• Python术语和常识
  • 19将文件分开存储到不同数组中
  • 20以写模式打开文件
  • 21捕获异常的详细信息
  • 22使用with来处理文件
  • 23控制输出文本的样式
  • 24利用pickle引擎的dump方法和load方法来处理数据


Python术语和常识:

10、第四章新知识点小结:
1)、在Python中else if写做elif
2)、字符串在调用upper()方法的时候,会得到一个全部大写的字符串
3)、ocals()方法:在程序中查找已经声明的变量名,in操作符用于检查成员关系。使用方法

if 'datas' in locals():

如果datas是已经申明的变量就返回true否则返回false
4)、str方法:可以将任何数据类型转化成字符串型
5)、print()方法的file参数可以指定数据发送/保存的路径
6)、strip()方法可以从字符串中去除不想要的空白
7)、finally组总会执行,而无论try/except语句中出现什么异常
8)、可以向except组中传入一个异常对象,并使用as关键字赋值给一个标志符
9)、with语句会处理所有已经打开的文件的关闭工作,无论哪里出现异常,都不会影响它。with语句也使用as关键字。
10)、sys.stdout是Python中所谓的标准输出,目标是屏幕,使用前需要import sys
11)、标准库pickle允许你容易而高效地将Python数据对象保存到磁盘以及从磁盘恢复

11、有些时候,需要查看输出结果,但是Python查程序执行完成之后就立刻关闭了Dos窗口,这样的话,实际上,是看不到什么的,这时在Python程序的结尾处加上input()函数,在执行到这里的时候就会自动的等待输入文本,之前输出的结果就能看到了。或者说在py文件所在的目录中打开Dos窗口,再运行py文件,就可以监控到报错了。

12、不可变类型:Python中的一些数据类型一旦赋值,这个值就是不可改变的了。

13、腌制:将数据对象保存到一个持久存储的过程
解除腌制:从持久存储中恢复数据

11、有些时候,需要查看输出结果,但是Python查程序执行完成之后就立刻关闭了Dos窗口,这样的话,实际上,是看不到什么的,这时在Python程序的结尾处加上input()函数,在执行到这里的时候就会自动的等待输入文本,之前输出的结果就能看到了。

2016-04-08

19、将文件分开存储到不同数组中:

还是使用sketch.txt文本

man = []
othor = [] 
try:
    data = open('sketch.txt')
    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':', 1)
            line_spoken = line_spoken.strip()
            if role == 'Man':
                man.append(line_spoken)
            elif role == 'Other Man':
                othor.append(line_spoken)
        except ValueError:
            pass
    data.close()
except IOError:
    print('The data file is missing!')      
#利用IDLE(Python解释器)执行到这里可能会报错,这样的话,可以先执行之前的代码,再执行下面两句。
print(man)
print(othor)

20、以写模式打开文件

out = open("data.out", "w") #data是所写的文件吗名,w是要使用的访问模式。

默认地,print()BIF显示数据时会使用标准输出(通常是屏幕)。要把数据写到一个文件,需要使用file参数来指定所使用的数据文件对象。

print("Norwegian Blues stun easily.", file=out) #Norwegian Blues stun easily.是写入内容,out是所写数据文件的对象名

在完成写入之后,要把关闭文件,这很重要,被称为刷新。

out.close()

访问模式辨析:

模式

解释

w模式

Python会打开指定的文件来完成写操作,如果这个文件已就存在了就清空它的内容,也就是完全清除。

a模式

要追加写入一个文件,则需要使用访问模式a。

w+模式

打开一个文件完成读和写两种操作,在执行写操作的时候,如果文件不存在会为你自动创建一个文件。

以写模式打开文件,代码如下:

'''这个Python脚本会把sketch.txt根据开头的是man还是other分成两部分存在不同的txt文件中'''
#先把sketch.txt中所有的文本都分别读到man和other中
man = []
other = [] 
try:
    data = open('sketch.txt')
    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':', 1)
            line_spoken = line_spoken.strip()
            if role == 'Man':
                man.append(line_spoken)
            elif role == 'Other Man':
                other.append(line_spoken)
        except ValueError:
            pass
    data.close()
except IOError:
    print('The data file is missing!')  

#再用open的写模式把man和other列表中的数据存到man_data.txt和other_data.txt中。
try:
    #用写模式(w)打开文件这两个文件并且分别赋至给一个文件对象,将内容写入到man_data.txt和other_data.txt中。
    man_file = open('man_data.txt','w') 
    other_file = open('other_data.txt','w')

    #使用print()将指定的列表保存到指定的磁盘文件,数据的流动是man->man_file->man_data.txt的顺序
    print(man, file=man_file)
    print(other, file=other_file)

    #不要忘记关闭这两个文件,刷新是很重要的。
    man_file.close()
    other_file.close()

#出现I/O异常在这里处理
except IOError:
    print('File error')

注意try/excrpt后面的冒号:

读文件的时候,如果出现IOError,原始数据不会损坏
写文件的时候,在关闭文件之前出现IOError,数据是会损坏的,这时使用finally来拓展try

man = []
othor = [] 
try:
    data = open('sketch.txt')
    for each_line in data:
        try:
            (role, line_spoken) = each_line.split(':', 1)
            #line_spoken调用strip函数返回一个新的除去了原字符串中空格的字符串
            line_spoken = line_spoken.strip()
            if role == 'Man':
                man.append(line_spoken)
            elif role == 'Other Man':
                othor.append(line_spoken)
        except ValueError:
            pass
    data.close()
except IOError:
    print('The data file is missing!')          

try:
    man_file = open('man_data.txt','w')
    other_file = open('other_data.txt','w')

    print(man, file=man_file)
    #如果执行到这里报错了,接下来的close语句就都不会执行了,这样会损坏数据的。
    print(othor, file=other_file)

    man_file.close()
    other_file.close()

except IOError:
    print('File error')

finally:
#把关闭文件的语句写在finally里面,这样的话,无论之前在哪里出现IOError都会执行finally里面的关闭语句
    man_file.close()
    other_file.close()

21、捕获异常的详细信息

为捕获的异常命名,然后转化成字符串类型再打印出来。

try:
    data = open('missing.txt')
    print(data.readline(), end='')
except IOError as err:
    #为捕获的异常命名,然后转化成字符串类型再打印出来。
    print('File erroe:'+str(err)
finally:
    if 'data' in locals():
        data.close()

·

22、使用with来处理文件

with使用了一种名为上下文管理协议的Python技术

try:
   '''使用了with就不用再设置finally了,下面这句with语句等价于 data = open('sketch.txt', "w")加上finally语句'''
    with open('sketch.txt', "w") as data:
        print(data.readline(), end='')
except IOError as err:
    print('File erroe:'+str(err)

还可以将两个文件操作写到同一个with里面

with open('man_data.txt', "w") as man_file,open('other_data.txt', "w") as other_file:

23、控制输出文本的样式

目前,在man_data.txt和other_data.txt中的是一个字符串数组,要把它改写成一行一行的样式。
可以通过改写print_lol函数来实现

'''为print_lol()添加第四个参数h=sys.stdout,来标识将把数据写入哪个位置,一定要设置缺省值。这样的话,在使用print_lol()不传fh参的时候也能直接打印在屏幕上(sys.stdout是一个与文件类型兼容的对象,名为标准输出,指输出到屏幕而不是任何路径下的文本。)'''

import sys
def  print_lol(the_list, indent=False, level=0, fh=sys.stdout):
    for each_item in the_list:
        if isinstance(each_item, list):
            #这里的fh已经变成man_file了,也就是man_data.txt
            print_lol(each_item, indent, level+1, fh)
        else:
            if indent:
                for tab_stop in range(level):
                    #普通的print函数也有fh参数,将其设置为fh(也就是man_data.txt)就能把输出的内容写入man_data.txt了。
                    print("\t",end='', file=fh)
                print(each_item)
            else:
                print(each_item, file=fh)
try:
    with open('man_data.txt', "w") as man_file,open('other_data.txt', "w") as other_file:
        print_lol(man,file=man_file)
        print_lol(other,file=other_file)
except IOError as err:
    print('File erroe:'+str(err)

24、利用pickle引擎的dump方法和load方法来处理数据

用pickle的dump()方法保存,用load()方法恢复。必须用二进制的方式打开这些文件。
1、导入pickle模块,import pickle
2、用pickle模块的内置函数dump和load来读取数据

#用pickle的dump()方法取数据,rb表示以2进制的方式写数据
with open('mydata.pickle','wb') as mysavedata:
#在这里存到mydata.pickle中的就是[1,2,'three']这个可变列表
pickle.dump([1,2,'three'],mysavedata)

#用pickle的load()方法读数据,wb表示以2进制的方式读数据
with open('mydata.pickle',"rb") as mysavedata:
    #将恢复之后的数据赋值给一个标识符,load()方法里面直接填写要加载的数据名就好
    a_list = pickle.load(mysavedata)

#一旦数据从Python的内存中读取到程序的运存中的时候,就可以当做普通数据处理了
print(a_list)