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

實現下效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM