文件操作

1.文件操作的函数

open(文件名(路径), mode="?", encoding="字符集")
模式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b
r w a r+ b
文件路径:
1. 绝对路径,从磁盘的根目录寻找 或者 从互联网上寻找一个路径
 2. 相对路径(用的多). 相对于当前程序所在的文件夹   ../返回上一层文件夹
f = open("哈哈哈哈哈", mode="r", encoding="UTF-8")
s = f.read()#如果在read()中加上数字表示读取几个字符
print(s)
f.close() # f.close(),每次执行完之后必须close, 否则在下面的程序中如果删除这个文件. 就会报错
 这样读的弊端会占用大量的内存,如果文件过大的话会导致内训崩溃.
 循环读取. 这种⽅式是最好的. 每次读取一行内容.不会产生内存溢出的问题.  
f = open("../def/哇擦.txt", mode="r", encoding="utf-8")

for line in f:
print(line.strip())
f.close

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

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

readlines将每一行形成一个元素,放到一个列表中,饭后将所有内容都读出来,所以也容易出现内存崩溃的问题。

 

f=open("文件名",mode="r",encoding="utf-8")
lst= f.readlines()
print(lst)
for el in lst:
    print(el.strip())

rb.读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集. 它是 读取非文本文件,比如mp3,视频,图片等

写文件:

带w的. 只要你操作了. 就会清空源文件,
# 如果文件不存在. 会自动创建文件
f = open("小娃娃", mode="w", encoding="utf-8")
f.write("金毛狮王")
f.flush() # 刷新. 养成好习惯
f.close()

wb模式下. 可以不指定打开文件的编码. 但是在写文件的时候必须将字符串转化成utf-8的 bytes数据
f = open("小娃娃", mode="wb")
f.write("金毛狮王".encode("utf-8"))
f.flush()
f.close()

追加(a, ab)
在追加模式下. 我们写入的内容会追加在文件的结尾

f = open("小娃娃", mode="a", encoding="utf-8")
f.write("麻花藤的最爱")
f.flush()
f.close()
读写模式(r+, r+b)
对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进行
写入.
f = open("小娃娃", mode="r+", encoding="utf-8") content = f.read() f.write("麻花藤的最爱") print(content) f.flush() f.close() 结果: 正常的读取之后, 写在结尾
r+模式下. 必须是先读取. 然后再写入
写读(w+, w+b)
先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用
f = open("小娃娃", mode="w+", encoding="utf-8")
f.write("哈哈")
content = f.read()
print(content)
f.flush()
f.close()

a+  (追加)模式下, 不论先读还是后读. 都是读取不到数据的

相关操作

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

是3的倍数.
通常我们使用seek都是移动到开头或者结尾.
移动到开头: seek(0)
移动到结尾: seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表
示开头, 1表示当前位置, 2表示结尾

f = open("hello", mode="r", encoding="utf-8")
# f.seek(3) # 3byte => 1中文
# s = f.read(1) # 读取一个字符
# print(f.tell()) # 表示光标在哪儿
# f.close()

# seek(偏移量, 位置)
# seek(0) # 开头
# seek(0,2) # 在末尾的偏移量是0 末尾

 truncate()截断文件

f = open("小娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 写入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后面的所有内容
f.close()
f = open("小娃娃", mode="r+", encoding="utf-8")
content = f.read(3) # 读取9个字符
f.seek(4)
print(f.tell())
f.truncate() # 后面的所有内容全部都删掉
# print(content)
f.flush()
f.close()

注意:在r+模式下,如果读取了内容,不论读了多少,光标显示多少,接着写入或者读取都是在末尾进行的。如果想进行截断操作,先把光标挪取到你要截断的部分,然后在进行截断。

  文件修改:将文件中的内容读取到内存中,把需要改的信息修改完毕,然后将源文件删除,将新的文件改成旧的文件名。

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", "小娃娃") # 重命名新文件

 ##############################内容补充#############################

1.文件缓冲区

open函数中的第三个参数是可选的buffering控制文件的缓冲,如果参数是0的话,表示没有缓冲,直接将参数写到硬盘上;  如果参数是1的话,操作是有缓冲的,先写到内存中,只有使用flush函数或者使用close函数的时候,才会将数据更新到硬盘中,如果参数大于1的话,则代表缓冲区的大小(单位是字节),-1(或者任意负数,)代表使用默认缓冲区的大小.

2.操作文件和目录

 在Python中对文件和目录的操作,常用os模块和shutil

 获取当前脚本工作的目录路径:os.getcwd()

 返回指定目录下的所有文件和目录名:os.listdir()     os.listdir("c:\\")

 删除一个文件:os.remove(filepath)

 删除多个空目录:os.removedirs(r'd:]python')

 检测给出的路径是否是一个文件:os.path.isfile(filepath)

 检测给出的路径是否是一个目录:os.path.isdir(filepath)

 判断是否数绝对路径:os.path,isabs()

 检测路径是否存在os.path.exists(),     检测D盘下是否有Python文件夹 os.path.exists(r"d:\python")

 分离一个路径的目录名和文件名 os.path.split()

 获取路径名:os.pathdirname(filepath)

 获取文件名:os.path.basename(filepath)

 读取和设置环境变量:os.getenv()和os.putenv()

 当前平台使用的行终止符:os.linesep,Windows使用的是'\r\n',Linux使用的是\n,Mac使用\r

 重命名文件或者目录os.rename(old  new)

 创建多级目录:os.makedirs(r"d:\python\text")

 创建单个目录:os.makdir('text')

 获取文件属性:os.stat(file)

 修改文件的权限和时间戳:os.chmod(file)

 获取文件的大小:os.path.getsize(filename)

 复制文件夹:shutil.copytree("olddir","newfdir")  olddir个newdir只能是文件,且newdir不能存在

 复制文件:shutil.copyfile("oldfile","newfile")  oldfile只能是文件,newfile可以是文件,也可以是目标目录

 移动文件(目录):shutil.move("oldpos","newpos")

 删除目录:os.rmdir('dir')只能删除空目录,shutil.rmtree("dir"),可以将空目录的和有内容的目录都能删除.

 

 

 


posted @ 2018-08-07 21:54  魏三斗  阅读(214)  评论(0编辑  收藏  举报