文件操作

主要内容:

  1,初始文件操作

  2,只读,(r , rb)

  3,只写(w , wb)

  4,追加(a , ab)

  5,r+ 读写

  6,w+写读

  7,a+写读(追加写读)

  8,其他操作方法

  9,文件的修改以及另外一种打开文件句柄的方式

主要内容:

  一,初始文件操作

   使用python来读写文件非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作,根据打开方式的不同能够执行的操作也会有相应的差异.

  打开文件的方式:r,w,a,r+,w+,a+,rb,wb,r+b,w+b,a+b 默认使用的是r(只读)模式

  二, 只读操作(r , rb)

f = open('a.txt', 'r', encoding='utf-8')
content = f.read()
print(content)
f.close()

   需要注意的是encoding表示编码集,根据文件的实际保存编码进行获取数据,对于我们而言,更过的是utf-8

  rb,读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集

f = open('a.txt', 'rb')
content = f.read()
print(content)
f.close()
#b'\xe9\x87\x91*\xe6\xb3\xb0*\xe4\xbd\xa0*\xe6\
# x98\xaf*\xe4\xb8\xaa*\xe5\xa5\xbd*\xe6\x97\xa5*\
# xe5\xad\x90*\r\n\xe6\x98\x8e*\xe5\xa4\xa9*\xe5\x
# b0\xb1*\xe6\x94\xbe*\xe5\x81\x87*\xe4\xba\x86'

   rb的作用:在读取非文本文件的时候,比如,读取mp3,图像,视频等信息的时候,就需要用到rb,因为这种数据没有办法直接显示出来,在后面我们文件上传下载的时候还会用到,还有,我们看的直播,实际上都是这种数据

绝对路径和相对路径

  1,绝对路径:从磁盘根目录开始一直到文件名

  2,相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是这个文件名,如果再上一层文件夹,则要,../

一定要使用相对路劲个,因为在我们把程序拷贝改别人使用的时候,直接把项目拷贝走就行能运行,但是如果用绝对路径吗那还需要拷贝外部文件

读取文件的方法:

  1,read()将文件中的内容全部读取出来,弊端,占内存,如果文件过大,容易导致内存崩溃

f = open('a.txt', 'rb')
content = f.read()
print(content)
f.close()

   2,read(n)读取n个字符,需要注意的是,如果再次读取,那么会在当前位置继续读而不是从头读,如果使用的是rb模式,ze读取出来的是n个字节

f = open('a.txt', 'r', encoding='utf-8')
content = f.read(4)
print(content)
f.flush()
f.close()

   3,readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个\n所以呢,需要我们是有strip()方法来去掉\n或者空格

f = open('a.txt', 'r', encoding='utf-8')
data = f.readline()
print(data)
f.flush()
f.close()

   4,readlines()将每一行元素,放到一个列表中,将多有的内容都读取出来,所以也是,容易出现内存崩溃的问题,不推荐使用

f = open('a.txt', 'r', encoding='utf-8')
data = f.readlines()
print(data)
for line in data:
    print(line.strip())
f.flush()
f.close()

   5,循环读取,这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题

f = open('a.txt', 'r', encoding='utf-8')
for line in f:
    print(line.strip())
f.flush()
f.close()

 注意:读取完的文件句柄一定要关闭 f.close()

三,写模式

写的时候注意,如果没有文件,则会创建文件,如果文件存在,则将原来的内容删除,再写入新的内容

f = open('a.txt', 'w', encoding='utf-8')
f.write("今天天气真好")
f.flush()
f.close()

 wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成为utf-8的bytes数据

f = open('a.txt', 'wb')
f.write('今天天气真好'.encode('utf-8'))
f.flush()
f.close()

 四,追加(a, b)

  在追加模式下,我们写入的内容会追加到文件的结尾

f = open("a.txt", 'a', encoding='utf-8')
f.write('我是好人')  # 会在文件最后追加这个内容
f.flush()
f.close()

 五,读写模式(r+ , r+b)

  对于读写模式,必须是先读,引文默认的光标在开头,准备读取的,当读完了之后在进行写入,我们以后使用频率最高的模式就是r+

注意:在r+模式下,必须先读取,然后写入

六,写读(w+,w+b)

  先将所有的内容清空,然后写入,最后读取,但是读取的内容是空的,不常用

注意:

w+模式下,一开始读取不到数据,然后写的时候再将原来的内容清空,所以很少用

七,追加(a+)

  a+模式下,不论先读还是后读,都是读取不到数据

八,其他相关操作

  1,seek(n)光标移动到n的位置,注意,移动的单位是byte,所以如果是utf-8的中文部分要是3的倍数.

  通常我们使用seek都是移动到开头或者结尾

  移动到开头:seek(0)

  移动到结尾:seek(0,2) seek的第二个参数表示是从哪个位置进行偏移,默认是0,表示开头,1,表示当前位置,2表示结尾

  注意:

  使用seek()方法报错:"io.UnsupportedOperation: can't do nonzero cur-relative seeks"原因分析:

使用时i,按照seek()方法的格式file.seek(offset, whence),后面的1代表从当前位置开始算起进行偏移,那么为什么报错呢?

这是因为,在文本文件中,没有使用b模式选项打开的文件,只允许文件开头计算相对位置,从文件尾计算时就会引发异常.将打开模式mode='rb'就可以了

  2,tell()使用tell()可以帮我们获取到当前光标在什么位置

  3,truncate()截断文件

  删除光标之后的内容

注意:在r+模式下,如果读取了内容,不论读取内容多少,光标显示的是多少,再写入或者操作文件的时候,都是在结尾进行的操作

九,文件以及另一种打开文件的方式

  

import os

with open('a.txt', 'r', encoding='utf-8') as f,\
    open('a_1.txt', 'w', encoding='utf-8') as w:
    content = f.read()
    content = content.replace('今天', '昨天')
    w.write(content)

os.remove('a.txt')
os.rename('a_1.txt', 'a.txt')

 同样,替换的时候也能进行遍历f句柄,达到节省内存的效果

posted @ 2018-06-08 16:27  猴里吧唧  阅读(101)  评论(0编辑  收藏  举报