文件处理

文件处理

1,打开文件

open('文件名',encoding='utf8') 此处看文档在电脑是用什么编码存储的,如果是gbk,那么此处encoding = 'gbk;若是utf8,那么encoding = 'utf8'

例如:

打开文档:新闻

f = open('新闻',encoding= 'utf8')
data = f.read()
print(data)===>结果是:文档新闻的所有内容

关闭: f.close()

 

2,文件读取

r 可读模式

-readable判断是否可读

f = open('新闻','r',encoding= 'utf8')  'r' 代表可读 ‘w'代表可写
print(f.readable())====》True

-readline 一行一行读取

f = open('新闻','r',encoding= 'utf8')
print('第1行', f.readline())=======》第1行 1111111111111

print('第2行', f.readline())=======第2行 222222222222

print('第3行', f.readline())=======第3行 3333333333

其中发现结果中间会空一行,消除空行,需要在最后加上end=''

print('第1行', f.readline(),end= '')

-readlines 全部读取并用列表表示出来

f = open('新闻','r',encoding= 'utf8')
print(f.readlines())======》['1111111111111\n', '222222222222\n', '3333333333']

3,文件写

w 可写模式

如果文件只可写:

-文件存在,会把文件内容清空,然后可写

-文件不存在,新建文件然后可写

f = open('新闻','w',encoding= 'utf8')

-write 默认不换行,如果需要换行需要自己输入换行(\n)

f = open('新闻','w',encoding= 'utf8')
f.write('你')
f.write('好')
f.write('吗')
查看文件,发现内容是‘你好吗’
若需换行,需写为:
f.write('你\n')
f.write('好\n')
f.write('吗\n')
其结果是:


-writable 是否可写

f = open('新闻','w',encoding= 'utf8')
print(f.writable())===》True

-writelines 写入列表,只能写字符串类型,不能是其他类型

f = open('新闻','w',encoding= 'utf8')
f.writelines(['111\n','222\n','我的'])
运行后,文档内容:
111
222
我的

将一个文件内容添加到另一个文件中

例如:将新闻文档中内容全部加到新闻new文档中,代码如下:

方法一:

f = open('新闻','r',encoding= 'utf8')
data_f = f.read()
f.close()

d = open("新闻new",'w',encoding='utf8')
d.write(data_f)
d.close()

**********************************

方法二:
with open('新闻','r',encoding= 'utf8') as f,\
open('新闻file','w',encoding= 'utf8') as d :
data = f.read()
d.write(data)

4,文件追加操作

 a 追加模式

f = open('新闻','a',encoding= 'utf8') a 代表追加写
f.write('你')====》会在文章最后追加上你

5,关闭文件

- 手动关闭 x.close()

-系统自动关闭:

with open(‘文件名’,可读/可写读/可写) as x:

  操作

 

6,可读可写模式

1)r+ 读写

2) w+ 写读

3) x+ 写读

4) a+ 写读

 

7,b模式(rb,wb,ab)

- rb 此处的b代表位,意味着是以二进制的方式存储在硬盘中。所以带b的方式不能指定编码

f = open('1', 'rb' )
d=f.read()
print(d)======》结果是:b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
print(d.decode('utf-8'))====》代表着是将其内容从二进制的方式编程utf-8的形式输出结果是;你好啊
字符串------encode------二进制byte
byte------decode------字符串

 -ab 也是不能指定编码

-wb

rb模式:以字节(二进制)方式读取文件中的数据
wb模式: 以字节(二进制)方式往文件中写入数据
ab模式: 以字节(二进制)方式往文件末尾追加写入数据

 

 8,文件的其他处理方式

newline = ''--------------代表读取真正的换行符号

 

seek 控制光标的位置  ----读字节

seek(x, b) 

-b 默认0,代表从开头开始算

f = open('我1', 'r',encoding= 'utf-8', newline='')
print(f.tell())===》刚开始,所以结果是0
f.seek(10)====》光标定位在10的字节上
print(f.tell())===》光标位置是:10
f.seek(3)====》定位在位置是3的字节上
print(f.tell())===》光标的位置是3

- b 是 1 的时候,代表相对位置。此时必须在b的模式下运行

f = open('我1', 'rb')
print(f.tell())
f.seek(10)
print(f.tell())======>10
f.seek(4,1)
print(f.tell())=======>14 因为是相对位置,10+4=14

-b 是2的时候,代表从倒数开始计算,此时必须在b的模式下运行

f = open('我1', 'rb')
print(f.tell())====0
f.seek(-5,2)
print(f.tell())====因为之前定位倒数第五个字节,因此正数位置是17
print(f.read())====》从光标所在位置开始读取因此结果是:b'123\n\n'

 

tell 光标所在位置------读字节

read -------读字符

truncate(x)----截取文章内容(从开头到截取的x位置)读取的是字节,它除了w模式下不行,其他模式下都可以运行。

我1 文件内容第一行是:你好,第二行是:hello  utf-8 一个中文字代表3个字节
f = open('我1', 'r',encoding= 'utf-8', newline='')
print(f.readlines())===windows系统显示文件所有内容['你好\r\n', 'hello']
print(f.tell())======>光标所在位置 13
print(f.seek(7))======》指定光标所在位置
*****************************
f = open('我1', 'r',encoding= 'utf-8', newline='')
print(f.read(1))=====>结果是:你

********************************** 

f = open('我1', 'r+',encoding= 'utf-8', newline='')
print(f.truncate(7))======>结果是:文章内容会变成:你好

 查找文件最后一行的内容操作如下:

方法一: 太占内存

f = open('我1', 'rb')
data = f.readlines()====》此处相当于把文档所有内容加载在内存中,以列表形式存储,每一行为列表的一个元素。
print(data[-1].decode('utf-8'))===》最后一行内容:nihaihaomadoushishenmm

 方法二:简单不占内存

f = open('我1', 'rb')
for i in f:
offs = -10 ========》此处设置一个变量,预估每行是10个字节
while True:
f.seek(offs,2)====》光标倒数定位
data = f.readlines()
if len(data) > 1:
print('文件的最后一行是:%s'% (data[-1].decode('utf-8')))===》文件的最后一行是:nihaihaomadoushishenmm
break
else:
offs*=2

 

 9,对文件进行增删改查

 参考装饰器中例子:对文件进行增删改查

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


posted @ 2021-03-31 15:46  wode110  阅读(65)  评论(0编辑  收藏  举报