文件操作
文件操作
f = open() # f: 学名:文件操作符 或 文件句柄 或者 文件操作对象# 习惯叫 f file f_obj f_handler fh
--------------------
f = open('file','w',encoding= ‘utf-8’)
#open打开文件是依赖了操作系统提供的途径
#操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
#win系统 gbk mac、Linux系统 utf-8
mac, linux,打开python文件,默认utf-8,而python 3 默认是utf-8 所以用mac、Linux。系统的人 不用encoding='utf-8'
win系统打开python文件,默认gbk,而python 3 默认是utf-8,所以需要encoding='utf-8'
例如:我们用pycharm 编写代码的时候,默认使用utf-8方式编写内容,所以要先把打开的文件转换成utf-8格式,保证打开
的文件类型变成utf-8,和你将要以哪种(utf-8)保持一致,才行
例子,一篇文章,如果全是英语 ,你再往里面输入英文 英译汉 可以直接变成汉语
一篇文章,如果全是英语,你再往里面输入日语, 英译汉 就会出错
***只要写入的类型和打开的类型一致,不管什么操作系统都不会出错
-----------------
r w a r+ w+ a+ b rb wb ab
f.readable() #判断文件是否可读
f.writable() #判断文件是否可写
f.write('int') #write() 写入的date 全是str (打开文件的同时,文件被清空)
write()如果文件不存在,那么不存在的文件会被创建
----------
找到文件:
绝对路径: 文件路径要用取消转译的方式来表示(两种方法): 1. \\ 2.r'path'
相对路径: 文件和py的 执行文件 在相同路径下,直接用文件的名字就可以
----------------------
f.close() 关闭文件 (操作系统级别的关闭)
del f 主动的释放了一个python程序内存中的变量
(解释器会主动回收,所以可写可不写(例如:定义a = 1,b = 2,程序后面不用,解释器会主动回收,不过回收是需要时间的))
-------------------
f.read() 一次性读出文件的所有内容, r 是按字符读, rb 按字节读
f.read(n) 一次读n个字符
f.readline() 一次读一行,每次执行readline就会往下读一行 *** 不能直接读第二行
print()本身就带换行符,而文件每行末尾也有换行符,就会造成输出一行字符一行空,一行字符一行空。。。
print(1) ---------1\n
print('1\n')------1\n\n
所以加.strip(),把每行末尾的换行符去掉 (strip 能去掉空格、制表符、换行符)
content = f.readline()
print(content.strip())
content = f.readline()
print(content.strip())
f.readlines() 返回一个列表,将文件中的每一行作为列表的一个元素
readlines有一个问题,如果文件有4g ,你的电脑4g内存就爆了
for line i f: 一次拿一行到内存 释放掉上一行
print(line.strip())
-----------
1 'name' 文件内容 2 apple 10 3 3 tesla 100000 4 mac 3000 2 5 lenovo 30000 3 6 chicken 10 3 7 phone 3 3000 8 9 程序: 10 f = open('name','r',encoding='utf-8') 11 dic = {} 12 shop_list = [] 13 for i in f: 14 if line.strip(): 有空行的话,line.strip()就是 '' 空,空的bool值就是False,不执行 15 dic1 = {'name':None,'price':None} 16 li = i.split() 17 dic1['name'] = li[0] 18 dic1['price'] = li[1:] 19 shop_list.append(dic1) 20 print(shop_list) 21 f.close()
-------------------
f = open('file','a',encoding= 'utf-8') 之追写模式 (从文件末尾写入)
追写模式
--------
r + 可读可写
1.先读后写: 写是追写 (不管你读几个字符,文件指针都会移到文件末尾)
2.先写后读:从头开始写 (会造成乱码)
w + 可写可读
一上来文件就清空了,读出的内容是打开文件后新写入的
a + 之追加可读
-------
f = open('file','rb') 以二进制模式打开 并且不需要指定编码了 (不需要encodin='')
(处理 视频 图片 等非文字文件 )
--------------------
f = open('name','r',encoding='utf-8')
a = f.read(3) #把读取的值赋值给变量a
f.close()
print(a) #文件已经关闭,但仍然可以使用变量啊a
------------
tell() 查看当前指针位置
seek(0) 把指针定位到文件开头
seek(0,2) 把指针定位到文件末尾
truncate(n) 截取从开头到n个字符(0--n),n以后的全部删掉
必须是写入模式 ‘r+’ ‘a’ ‘a+’ ‘w’ ‘w+’ 也就是除了'r'模式
----------------
文件的修改
1 name文件 2 aaaaaaa 3 bbbbbbb 4 cccccccc 5 6 f = open('name','r',encoding='utf-8') 以 r 模式打开name文件 7 f1 = open('name1','w',encoding='utf-8') 以 w 模式创建 name1 文件 8 for line in f: 9 line = line.replace('a','x') 把‘a' 替换成 x 10 f1.write(line) 把修改后的字符串写入name1 11 f.close() 12 f1.close() 13 import os os模块 14 os.remove('name') 删除name文件 15 os.rename('name1','name') 把name1 文件改成原name文件 16 17 name文件 18 xxxxxxxx 19 bbbbbbb 20 xxxxxxxx 21 文件不能直接修改,可以把修改的内容存在另一个文件,把原文件删除,然后另一个文件改名字,间接完成修改 22 ----------------- 23 24 with 可以不用关闭文件 25 name文件 26 xxxxxxxx 27 bbbbbbb 28 xxxxxxxx 29 30 with open('name','r',encoding='utf-8') as f,\ 31 open('name1','w',encoding='utf-8') as f1: 32 for line in f: 33 line = line.replace('x','a') 34 f1.write(line) 35 import os 36 os.remove('name') 37 os.rename('name1','name') 38 39 name文件 40 aaaaaaa 41 bbbbbbb 42 cccccccc
-----------------------