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

实现下效果如下:

posted @ 2019-05-08 23:01  百尺鸟  阅读(2905)  评论(0编辑  收藏  举报