发布时间:2020/07/12 作者:天马行空 阅读(1250)
一、文件读取
文件读写,是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"
第二个形参mode传入了"r",意思是我们要使用只读的方式来处理文件。
1.2、读取内容
使用f.read( )读取文件f中的内容,read( )函数是文件对象的特有方法,它没有参数。
如果文件过大,以至于整体读取的字符串需要很长很长,那么read( )方法就不适用了。
读取大文件我们可以使用readline( )和readlines( )方法。
readline( )方法是一行一行地读取数据,每次都要保存位置的行为,使得它的读取速度非常慢。
readlines( )方法是一次性读取整个文件的所有行的数据,数据的行就是使用\n来区别的(在windows系统里面,有时是\r\n)。
1.3、关闭文件
关闭文件的方法简单粗暴:文件变量.close( )
二、文件写入
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()
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( )
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.关闭文件。
与读取文件相同,文件写入还是三步:打开文件、写入内容和关闭文件。
练习:读取excel中的成绩,计算排名
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)