python的文件读写
一、python文件读写小结:
读写文件是最常见的IO操作,python内置了读写文件的函数,用法和c是兼容的.
读写文件前,我们必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(文件描述),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件).
1、读文件
要以读文件的模式打开一个文件对象,使用python内置的open()函数,传入文件名和标识符:
f = open("t1.txt","r",encoding="utf-8")
标识符'r'表示读。
如果文件不存在,open()函数就会抛出一个IOError的错误,并且会给出详细的错误码和信息,告诉你文件不存在。
f = open("t122.txt","r",encoding="utf-8")
Traceback (most recent call last):
File "D:/Learn/python/day14/test.py", line 1, in <module>
f = open("t122.txt","r",encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 't122.txt'
如果文件打开成功,接下来,调用read()方法可以一次性读取文件的全部内容,python把内容读取到内存,用一个str对象表示。
print(f.read())
输出:
hello world!
最后一步调用close()方法关闭文件,文件使用完毕之后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限制的。
f.close()
f = open(r"文件地址","读取方式",encoding="utf-8")
"r":以只读方式
encoding:读取的编码格式
f.read() :一次性读取文件全部内容
f.close():关闭流
r"文件地址":不让转义字符“\”起作用
由于文件读写都有可能产生IOError,一旦出错,后面的f.close()就不会调用,所以,为了保证文件不管是否执行出错都能够正确的关闭文件,我们可以使用try … finally来实现.
try: f = open("t1.txt", "r", encoding="utf-8") print(f.read()) finally: if f: f.close()
但是每次都这么写实在太繁琐,所以,引入了with语句来自动帮我们调用close()方法:
with open("t1.txt", "r", encoding="utf-8") as f:
print(f.read())
这和前面的try…finally是一样的,但是代码更加简洁,并且不必调用f.close()方法。
注意: 使用read()
会一次性读取文件的全部内容,如果你的文件特别大,比如说有5G,那么你的内存就爆了,所以,为了保险起见,我们可以反复调用read(size)
方法,每次最多读取size个字节内容,另外调用readline()
可以每次读取一行内容,调用readlines()
一次性读取所有的内容,并按行返回list,因此,要根据需要决定怎么调用。
如果文件很小,read()一次读取最方便,如果不能确定文件大小,反复调用read(size)比较保险,如果是配置文件,调用readlines()最方便。
for line in f.readlines():
#把末尾的'\n'删掉
print(line.strip())
2、写文件
写文件和读文件都是一样的,唯一的区别就是调用open()
函数时,传入标识符'w'或者'wb'表示写文件或写二进制文件:
f = open("/users/demo/test.txt",'w') f.write('hello, world!') f.close()
你可以反复调用write()
来写入文件,但是务必要调用f.close()
来关闭文件.
当我们写入文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入,只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘,忘记调用close()的后果是数据可能只写了一部分到磁盘,剩余的丢失了,所以,还是使用with语句来的保险:
with open('/users/demo/test.txt', 'w') as f: f.write('hello, world')
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转成指定编码。
以'w'模式写入文件时,如果文件已经存在,直接覆盖(相当于删掉后新写入一个文件),如果我们希望追加到文件的末尾怎么办?可以传入'a'以追加模式写入。
with open('/users/demo/test.txt', 'a') as f:
f.write('hello, world')
二、把csv格式转化为html格式
代码如下图
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import pandas as pd df = pd.read_excel('Python成绩登记信计.xlsx') da = df.to_csv('E:\Anaconda之作业\Python成绩登记信计.csv') da = pd.read_csv('E:\Anaconda之作业\Python成绩登记信计.csv',index_col=0) da = da.replace('优秀','90') da = da.replace('良好','80') da = da.replace('合格','60') da = da.replace('不合格','10') da = da.fillna(0) print(da) dc = da.to_csv('E:\Anaconda之作业\Python成绩登记信计.csv') seg1 = ''' <!DOCTYPE HTML>\n<html>\n<body>\n<meta charset=utf-8> <h1 align=center>Python成绩登记信计</h1> <table border='1' align="center" width=100%> <tr bgcolor='yellow'>\n''' seg2="</tr>\n" seg3="</table>\n</body>\n</html>" def fill_data(locls): seg = '<tr><td align="center">{}</td><td align="center">\ {}</td><td align="center">{}</td><td align="center">\ {}</td ><td align="center">{}</td></tr><td align="center">{}</td></tr>\n'.format(*locls) return seg fr = open("E:\Anaconda之作业\Python成绩登记信计.csv","r",encoding='utf-8') ls = [] for line in fr: line = line.replace("\n","") ls.append(line.split(",")) print(ls) fr.close() fw = open("E:\Anaconda之作业\Python成绩登记信计.html","w",encoding='utf-8') fw.write(seg1) fw.write('<th width="10%">{}</th>\n<th width="10%">{}</th>\n<th width="10%">{}</th>\n<th width="10%">{}</th>\n<th width="10%">{}</th>\n<th width="10%">{}</th>\n'.format(*ls[0])) fw.write(seg2) for i in range(len(ls)-1): fw.write(fill_data(ls[i+1])) fw.write(seg3) fw.close
实现下效果如下:
略