python基础第八课--python的文件IO(小白piao分享)

IOstream:
文件IO:
普通系统是无法直接操作磁盘文件的
通过系统所提供的接口完成操作
对文件进行的基本操作:
通过文件实例对象而实现对文件操作
文件的实例对象:文件描述符
打开文件的函数:open(文件路径,操作模式)
open中的参数:
文件名(尽量使用原始字符串):文件的相对或者绝对路径
标识符:表示打开文件后对文件的操作模式
读:r(只读) rb(读二进制) r+(读写) rt(读文本)
写:w (只写)wb(写二进制) w+(写读) wt (写文本)
追加:a a+ at ab(文件流指针的位置位于文件结尾(EOF)处

关于open函数:
当打开文件不存在时候,会抛出IOError的异常,并且给出详细的错误码和详细信息
fd = open(‘a.txt’,‘r’)#r 和 r+会在文件不存在的情况下抛出FileNotFoundError的异常
其他两种模式均会直接创建文件,但是w每次会清空文件(如果文件存在会覆盖之前的内容)
a模式打开文件时候,文件指针在结尾,所以要移动文件指针到文件开头

文件打开后的处理:read()#可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象(返回值为str)表示

fd = open('hello.txt','w+')
fd.write('hello world!')
fd.close()

fd1 = open('hello.txt','r+')
str2 = fd1.read()
print(str2)
fd1.close()

在文件进行完读写操作以后要及时关闭文件使用close函数
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。
所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

try :
	fd = open('hello.txt','r+')#如果open失败会抛出异常,会导致close不执行,
								#所以不论打开成功与否都要正确关闭文件
	print(fd.read())
finally:
	if fd :
		fd.close()

文件IO的简单操作:

使用with文本管理器,可以省略上述的try。。。fianlly。。。

with open('file_path','r+') as f:
	print(f.read())
#当open函数打开的文件不存在时候,会抛出FileIOError的异常

#read()函数:一次读取所有内容
try:
	with open('hello1.txt','r') as f:
		print(f.read())
except Exception as e:
	print('file error:',e)

有关文件读写的相关操作:
读:
read():一次性读取文件的所有内容,如果文件的大小的大于了10G,就会爆内存
保险期间是反复调用read(size)方法实现每次读取固定长度的内容(size的单位是字节)

realine():一次性读取文件中一行的内容(所有字符,包含结尾的回车)
readlines():读取文件所有内容,将每行的内容存放在列表中作为一个元素

file-like Object(as的意思)
像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,
还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。

如果使用w模式,则对象无read()方法,这就是所谓的file——like object

with open('hello.txt','w') as f:
	print(f.read())		#io.UnsupportedOperation: not readable

写:先将文件写入内存中,等空闲时再写入磁盘文件,如果不进行close的操作可能会直接导致文件没有写完整,
所以close可以保证使文件写入完整,不能够丢失!!!
write(string):向文件写入内容,该函数会返回写入文件的字节数。
writelines(list):将列表中的元素以行的形式写入文件中

import os
f = open('hello.txt', 'r+')  # 以读写模式打开urls.txt文件
url = ''                            # 保存当前读上来的文本
while True:
    url = f.readline()          # 从urls.txt文件读一行文本
    url = url.strip()          # 将最后的行结束符去掉
    if url == '':               # 当读上来的是空串,结束循环
        break;
    else:
        print(url)              # 输出读上来的行文本
print('--------------')
f.seek(0)                        # 将文件指针重设置为0

print(f.readlines())                       # 读urls.txt文件中的所有行
f.write('http://baidu.com' + os.linesep)   # 向urls.txt文件中添加一个新行
f.close()                                  # 关闭文件

f = open("hello.txt", 'a+')         # 使用“a+模式”再次打开urls.txt文件

# 定义一个要写入urls.txt文件的列表
urlList = ['https://google.com' + os.linesep,'https://jd.com' + os.linesep]

f.writelines(urlList)   # 将urlList写入urls.txt文件
f.close()              # 关闭urls.txt文件

改变文件指针位置
Python语言打开文件后,会有一个指针标识文件内容的读取位置,默认情况下,

利用seek()函数可以对文件的读取指针进行重新定位。seek函数的用法是:
f.seek(offset[,orgset])

其中offset表示读取指针移动的位数,可以是正数,也可以是负数,每一位对应一个字节。
orgset为可选参数,取值可以是0,1或2;
0为默认值,可以不写,表示从文件头开始移动指针到offset位;
1表示读取指针从当前位置移动offset位;
2表示从文件的尾部移动读取指针offset位。

这里要注意的是如果orgset不是取默认0,也就是说如果想从文件的中间或尾部开始移动读取指针,
文件的打开方式只能是二进制,否则程序运行时会提示输入输出错误:io.UnsupportedOperation:
can’t do nonzero cur-relative seeks。

使用FileInput对象读取文件
如果需要读取一个非常大的文件,使用readlines函数会占用太多内存,因为该函数会一次性将文件所有的内容都读到列表中,列表中的数据都需要放到内存中,所以非常占用内存。
解决方法:

方法1. 可以使用for循环和readline方法逐行读取。
方法2. 可以使用fileinput模块中的input函数读取指定的文件。
input方法返回一个FileInput对象,通过FileInput对象的相应方法可以对指定文件进行读取,FileInput对象使用的缓存机制,并不会一次性读取文件的所有内容,所以比readlines函数更节省内存资源。

使用FileInput对象读取文件

import fileinput
fileobj = fileinput.input('./files/urls.txt')  # 使用input方法打开urls.txt文件
print(type(fileobj))             # 输出fileobj的类型
 
print(fileobj.readline().rstrip())  # 读取urls.txt文件第1行

for line in fileobj:                # 通过for循环输出urls.txt文件的其它行
    line = line.rstrip()
    
    if line != '':                   # 如果file不等于空串,输出当前行号和内容        
        print(fileobj.lineno(),':',line)  
    else:
        # 输出当前正在操作的文件名
        print(fileobj.filename())   # 必须在第一行读取后再调用,否则返回None
    
    # 注意:filename方法必须在第1次读取文件内容后调用,否则返回None

#1读写文本数据:
#1.1.1 对文本数据进行处理,可能需要面对不同的编码格式的文件
#1.1.2 解决方案:
#使用open()函数和rt模式配合读取文本文件:
with open(‘somefile.txt’,mode=‘rt’) as fd:
data = fd.read()#一次性读取文件中的所有内容到程序中;原型:read([size]) size–:读取的字节数
print(data)
‘’’
hello world
hello python
hello everyone
hello everybody
‘’’

with open(‘somefile.txt’,‘rt’) as fd:
for line in fd:#逐行遍历文件对象中的内容
print(line)#打印每行内容
‘’’
hello world

hello python

hello everyone

hello everybody

‘’’

    #系统默认的文本编码格式可以通过sys.getdefaultencoding()来查看,这项设定都被设定为utf-8。
    #如果已知了某个文件额编码格式,可以通过对open()的参数encoding进行修改来满足编码格式的要求。
    #open()中的默认参数errors可以进行修改‘replace’和‘ignore’
        #replace:将错误处替换为?
        #ignore:忽略错误将错误替换为‘’
发布了17 篇原创文章 · 获赞 1 · 访问量 362

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/104113292