文件的操作

文件操作的函数

open(文件名(路径),  mode(模式) = '?',   encoding ='字符集' )

路径:

1.绝对路径,从磁盘的根目录寻找 或从 互联网上寻找一个路径

2.相对路径,相对于当前程序所在的文件夹      ../(表示上一层文件夹) (用相对的比较多)

 

模式

r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b

 

r是读取文件

f = open('哈哈',mode='r',encoding='utf-8')
for line in f:  # 文件是一个可迭代的对象,处理文件一行一行读多用for循环
    print(line.strip())  # 一行一行处理数据
f.close()

带w的,只要你操作了,就会清空源文件,如果文件不存在,则会自动创建文件

f = open('哈哈',mode='w',encoding='utf-8')
f.write('呵呵')
f.flush()
f.close()

a模式(追加),写的时候,换行需要手动控制   \n

f = open('哈哈',mode='a',encoding='utf-8')
f.write('呵呵')
f.write('吼吼')
f.flush()
f.close()

rb,wb,ab,bytes处理的是非文本文件,mode里如果有b,encoding就不能给了

f = open('c:/0002.jpg',mode='rb')  # 这里不能写encoding
e = open('e:/0001.jpg',mode='wb')
for line in f:  # 从c盘读取 line你是不知道读取了多少数据的
    e.write(line)  # 写入到e盘
f.close()
e.flush()
e.close()

 

r+

不论你读取了多少内容,光标在哪儿,写入的时候都是在结尾写入,除非上来就写入,这时写入是在开头

最好用的读写同时存在的模式

r+ 读写模式,先读后写

 

f = open('哈哈',mode='r+',encoding='utf-8')
s = f.read(3)  # 读取三个字符
print(s)
f.write('呵呵呵')  #  在末尾写入
f.close()

w+  很少用,因为会清空文件中的内容

w+ 写读模式,先写后读

f = open('哈哈',mode='w+',encoding='utf-8')
f.write('Hello World!')  # 写完之后光标在最后,读取是没有内容的
f.seek(0) # 移动光标,移动到开头
s = f.read()
print(s)
f.close()

a+   和w+类似

f = open('哈哈',mode='a+',encoding='utf-8')
f.write('Hello World!')  # 写完之后光标在最后,读取是没有内容的
f.seek(0) # 移动光标,移动到开头
s = f.read()
print(s)
f.flush()

 

其他相关操作

seek()

  seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中文部分要
  是3的倍数.
  通常我们使用seek都是移动到开头或者结尾.
  移动到开头: seek(0)
  移动到结尾: seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表
  示开头, 1表示当前位置, 2表示结尾

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close()

 

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

 

truncate() 截断文件   

关于truncate(n), 如果给出了n. 则从开头开头进行截断, 如果不给n, 则从当前位置截断. 后面
的内容将会被删除

 

修改文件以及另一种打开文件的方式

文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新
文件的名字改成老文件的名字

import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
 open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
 content = f1.read()
 new_content = content.replace("冰糖葫芦", "大白梨")
 f2.write(new_content)
os.remove("小娃娃") # 删除源文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件

弊端: 一次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作

import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
 open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
    for line in f1:
        new_line = line.replace("大白梨", "冰糖葫芦")
        f2.write(new_line)
os.remove("小娃娃") # 删除源文件
os.rename("小娃娃_new", "⼩娃娃") # 重命名新文件

 

posted on 2019-05-07 14:33  Little_Raccoon  阅读(149)  评论(0编辑  收藏  举报