前言
在磁盘上读写文件的功能是操作系统提供的,现在操作系统不允许普通程序直接操作磁盘,所以读写文件是请求操作系统打开一个文件对象(文件描述符),然后通过操作系统提供的接口对这个对象读写数据,所以使用完文件必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间打开的文件数是有限的。
文件的读写
读文件open()函数
open(name[, mode[, buffering]]) -> file object
若该路径找不到相应的文件夹,则报错:IOError
f = open(“F:/python/tian.txt”,”r”)
read() 函数,可一次读取文件的全部内容,以str的类型存在内存中
print type(f) # 文件 file
print type(f.read()) # 字符串 str
在IDE中 read() 函数读取的中文是乱码,所以需要解码。
print f.read().decode(“gbk”,”ignore”).encode(“utf-8”)
调用read()函数会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以提供:
一次读取 size 字节的内容
f.read(size)
一次读取一行的内容
f.readline()
一次读取所有的内容,但是按照行返回list
f.readlines()
如下所示:
for line in f.readlines():
print(line.strip()) # 把末尾的’\n’删掉
文件对象会占用操作系统的资源,并且操作系统同一时间打开的文件数量是有限的所以文件的相关操作完成时,需要close()
f.close()
但是,当open()报错的时候,程序跳出,则不执行close()函数,
所以可以采用try…finally函数体,无论try函数体出现什么错误都会执行finally函数体
try:
d = open("F:/python/tian.txt","r")
print d.read().decode("gbk","ignore").encode("utf-8")
finally:
if d:
d.close()
python有with语句 自动帮我们调用close()函数
则使用with语句写文件是一个好函数
with open("F:/python/tian.txt","r") as h:
print h.read().decode("gbk","ignore").encode("utf-8")
python 提供一个codecs模块帮我们在读文件的时候自动转换编码,读出unicode编码
import codecs
with codecs.open("F:/python/test_zhongwen.txt","r",'gbk') as f:
print f.read().encode("utf-8")
写文件,文件不存在则新建,若存在则直接写.
但是写文件时,系统不会及时的把数据写入磁盘,而是放入内存中,当系统空闲的时候才往内存中写,只有close()的时候才会把所有的文件写入磁盘上所以忘记close的时候,常常磁盘上数据可能写入的不完整。
f = open("F:/python/test_21.txt",'w')
f.write("blwy,rzss\n")
f.write('hello,world!')
f.close()
# 或者使用with语法
with open("F:/python/test_21.txt",'w') as f:
f.write("xxxx")
文件和目录操作
提供os模块可以直接调用操作系统提供的接口函数。
import os
# 查看绝对路径
os.path.abspath(".")
# 获得当前工作目录
os.getcwd()
# 将两个路径合并
# 注意 linux下合并符为/ 而win下合并符为\
os.path.join("F:/python","write1_test.txt")
# 将两个路径拆分
os.path.split("F:/python/write1_test.txt")
# 返回文件名字
os.path.basename("F:/python/write1_test.txt")
# 返回文件路径
os.path.dirname("F:/python/write1_test.txt")
# 直接得到文件的扩展名
os.path.splitext("F:/python/write1_test.txt")
# 创建目录
os.mkdir("F:/python/mkdir_test")
# 删除目录
os.rmdir("F:/python/mkdir_test")
# 创建文件
f = open("F:/python/mdir_test.txt","w")
f.close()
# 文件改名字 old/new 都必须写完整路径(可以理解为替换)
os.rename("F:/python/mdir_test.txt","F:/python/mdir.txt")
# 删除文件
os.remove("F:/python/python_test_workplace/mdir.txt")
# 复制函数引用新的模块 shutil
import shutil
shutil.copyfile("F:/python/python_test_workplace/1.txt","2.txt")
一生顺利,一生被爱。