python学习第13节:文件读写和综合训练

发布时间:2020/07/12 作者:天马行空 阅读(1100)

一、文件读取
文件读写,是Python读取计算机文件后进行一系列操作,再存储到计算机中的一个过程。
文件读取分为三大步:1.打开文件;2.读取内容;3.关闭文件。

f = open('test.txt','r')
content = f.read()
f.close()
print(content)


1.1、打开文件
使用内置函数open( )打开文件test.txt,然后使用变量f来存储打开的文件。
open( )函数接收了两个参数,第一个是文件路径,第二个是文件的读写模式。这两个参数我们使用了位置传参,分别传入"test.txt"和"r"。
两个实参对应的形参分别是file、mode。file表示要读写的文件路径,是字符串类型;mode是读写模式,也是字符串类型。
文件路径就是指文件的保存位置,有绝对路径和相对路径之分。
绝对路径:"C:/Python/第九关/test.txt"
相对路径:"../第九关/test.txt"

图片.png

第二个形参mode传入了"r",意思是我们要使用只读的方式来处理文件。


1.2、读取内容
使用f.read( )读取文件f中的内容,read( )函数是文件对象的特有方法,它没有参数。

如果文件过大,以至于整体读取的字符串需要很长很长,那么read( )方法就不适用了。

读取大文件我们可以使用readline( )和readlines( )方法。
readline( )方法是一行一行地读取数据,每次都要保存位置的行为,使得它的读取速度非常慢。

readlines( )方法是一次性读取整个文件的所有行的数据,数据的行就是使用\n来区别的(在windows系统里面,有时是\r\n)。

图片.png


1.3、关闭文件
关闭文件的方法简单粗暴:文件变量.close( )

图片.png



二、文件写入
2.1、打开文件
在写入文件时,我们依然使用open( )函数打开文件。
第一个参数依然是文件路径,第二个参数依然是读写模式,这里使用写模式,也就是"w"。
Python的写入模式有一个问题,就是在写入的时候会先暴力清空文件所有内容,再从第一行开始写。
如果你不想覆盖原来的内容,可以使用另一种模式"a"(append)来追加。

f_w = open("./tmp/诗经.txt","w")
f_w.write("死生契阔,与子成说。")
f_w.close()
f_w = open('./tmp/诗经.txt','a')
f_w.write("执子之手,与子偕老。")
f_w.close()
f_r = open('./tmp/诗经.txt','r')
print(f_r.read())
f_r.close()

图片.png


2.2、写入内容
write( ) 方法用于向文件中写入指定字符串,语法为:文件变量.write(需要写入的内容)。我们可以多次调用write( )函数,多次写入内容,如下代码。
f = open('./tmp/test.txt', 'w')
f.write('1234\n')     
f.write('4321\n')
f.close()

2.3、关闭文件
如果一时粗心,忘记了关闭文件,这时候就会出现一些状况,比如文件写入失败,这是因为在写入过程中,关闭文件的操作相当于告诉电脑“我写完啦,可以保存啦”。
只有记得关闭文件才能保证写入的内容已经在文件里被保存好了。
不去关闭这个文件,它就会一直处于被占用状态,会影响到其他操作;另外还有一些潜在的问题,比如说计算机能够打开的文件数量是有限制的,open( )过多而不close( )的话,你就不能再打开文件了。
代码执行过程中发生了异常退出,会导致后面关闭文件的代码不能执行,那也就运行不到close(),怎么办?
可以使用with语句来解决:

with open('./tmp/school.txt', 'w') as f:
    f.write("哈哈哈")

with open() as 文件变量:来打开文件,在运行到语句末尾时会自动进行文件关闭。即便是文件操作错误,也可以保证文件被关闭并保存。如果在你自己的电脑上运行上述程序,你便可以看到被保存的文件。
也可以这样解决:

f= open("./tmp/school.txt","w")
try:
    f.write("哈哈哈")
except:
    print("写入内容失败")
finally:
    f.close( )

图片.png


replace()方法
Python中可以使用 字符串变量.replace(x, y) ,它的作用是把字符串中的所有x替换为y。我们可以使用字符串变量.replace("\n", "")把字符串中的换行符\n改为空,也就相当于把换行符去掉。
替换的操作不会更改原字符串内容,需要将替换好的内容再次赋值于一个变量,当然新变量名也可以和原来的变量名一样。

split()方法
将字符串分割成一个列表,语法:字符串变量.split(',')

创建明星档案并统计男女比列

with  open("superstarinfo.txt", "r") as f:
    head = f.readlines()
    head[0] = head[0].replace("\n","")
    head_list = head[0].split(',')
#创建明星档案
data_dict = {}
for i in head[1:]:
    i = i.replace("\n","")
    data = i.split(',')
    name = data[1]
    data_dict[name] = {}
    for j in range(2, len(head_list)):
        data_dict[name][head_list[j]] = data[j]

#根据档案分别统计男女比列
def get_sex(my_dict):
    sex_dict = {"男": 0, "女": 0}
    for superStar in my_dict.values():
        if superStar['性别'] == '男':
            sex_dict['男']+=1;
        else:
            sex_dict['女']+=1;
    return sex_dict
sex_dict = get_sex(data_dict)
for sex in sex_dict:
    print("100个最受欢迎的明星中,有{}明星{}个".format(sex, sex_dict[sex]))


总结:

文件路径就是指文件的保存位置,有绝对路径和相对路径之分。
绝对路径就是指文件在储存器中的保存位置,是最完整的路径。相对路径则是指文件相对于当前文件夹的路径。
文件读取分为三大步:1.打开文件;2.读取内容;3.关闭文件。
与读取文件相同,文件写入还是三步:打开文件、写入内容和关闭文件。

图片.png


练习:读取excel中的成绩,计算排名

图片.png

def get_data():
    with open('成绩单.txt') as f:
        data = f.readlines()
        head_list = (data[0].replace('\n','')).split(',')
        
        score_dict = {}
        for row in data[1:]:
            row = row.replace("\n","")
            data = row.split(',')
            name = data[0]
            score_dict[name] = {}
            for j in range(1,len(head_list)):
                score_dict[name][head_list[j]] = data[j]
    return score_dict


def get_order(score_dict, name = '刘星'):
    yuwen = []
    shuxue = []
    yingyu = []
    zongfen = []
    for row in score_dict.values():
        yuwen.append(row['语文'])
        shuxue.append(row['数学'])
        yingyu.append(row['英语'])
        zongfen.append(row['总分'])
    
    yuwen = sorted(yuwen, reverse=True)
    shuxue = sorted(shuxue, reverse=True)
    yingyu = sorted(yingyu, reverse=True)
    zongfen = sorted(zongfen, reverse=True)
    print('{}的语文成绩排名第{}名\n'.format(name,yuwen.index(score_dict[name]['语文'])+1))
    print('{}的数学成绩排名第{}名\n'.format(name,shuxue.index(score_dict[name]['数学'])+1))
    print('{}的英语成绩排名第{}名\n'.format(name,yingyu.index(score_dict[name]['英语'])+1))
    print('{}的总分成绩排名第{}名\n'.format(name,zongfen.index(score_dict[name]['总分'])+1))
if __name__ == '__main__':
    score_dict = get_data()
    get_order(score_dict)



关键字python python教程