08_python_文件操作

一、初始文件操作

  打开⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式
1 f = open("少妇嫩模.txt",mode="r", encoding="utf-8")  # 注意encoding表示编码集. 根据文件的实际保存编码进行获取数据
2 文件句柄     文件路径    操作模式     使用编码
3 f.close() # 打开一个文件后必须将其关闭

二、读

  1、只读( r   r+)
  rb. 读取出来的数据是bytes类型, 在rb模式下.。不能选择encoding字符集, rb的作⽤: 在读取非⽂本⽂件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤到 rb. 因为这种数据是没办法直接显⽰出来的
1 f = open("少妇嫩模.txt",mode="rb" )
2 content = f.read()
3 print(content)
4 f.close()
5 结果:
6 b'\xe6\xaf\x85\xe5\x93\xa5, \xe5\xa4\xaa\xe7\x99\xbd,
7 wuse\n\xe5\x91\xb5\xe5\x91\xb5\n\xe6\x97\xa5\xe5\xa4\xa9'
  绝对路径:(1)从磁盘根目录找  (2)网络上的路径
  相对路径:相对于当前你这个程序所在的文件夹   ../  返回上层目录
 
  2、读取文件的方法
    (1)read() 将文件全部读取出来,弊端:占内存,如果文件过大,会导致内存溢出
1 f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
2 content = f.read()
3 print(content)
4 
5 f.read(3) #表示读取3个字符需要注意的是. 如果再次读取. 那么会在当前位置继续去读而不是从头读, 如果使用的是rb模式. 则读取出来的是n个字节
 (2)readline()
    ⼀次读取⼀⾏数据, 注意: readline()结尾, 注意每次读取出来的数据都会有⼀ 个\n 所以呢. 需要我们使⽤strip()⽅法来去掉\n或者空格
    (3)readlines()
    会把数据全部读出来,同样会导致内存溢出
    (4)for循环迭代文件句柄读取文件(推荐
1 f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
2 for i in f:
3     print(i, end = ',')  # print(self, *args, sep=' ', end='\n', file=None)  可以修改end 把\n换成别的
4 f.close() # 操作完成必须关闭字典

二、写( w wb)

  注意:写的时候. 如果没有⽂件. 则会创建⽂件, 如果⽂件存在. 则将原件中原来的内容删除, 再 写入新内容
 1 f = open("娃娃", mode="w", encoding="utf-8")
 2 f.write("狮王")
 3 f.flush() # 刷新. 养成好习惯
 4 f.close()
 5 
 6 
 7 
 8 
 9 f.write('a')
10 f.write('b') # 第二次写的时候是不会清空的了,直接追加写

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

1 f = open("⼩娃娃", mode="wb")
2 f.write("⾦⽑狮王".encode("utf-8"))
3 f.flush()
4 f.close()

三、追加( a ab)

  在追加模式下,写入的内容会追加到文件末尾
1 f = open("⼩娃娃", mode="a", encoding="utf-8")
2 f.write("麻花藤的最爱")
3 f.flush()
4 f.close()

四、读写模式

  对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进⾏ 写入. 我们以后使⽤频率最⾼的模式就是r+

五、写读模式

  先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤。a+模式下, 不论先读还是后读. 都是读取不到数据的. 

六、其他操作

  1、seek(n)
  seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂部分要 是3的倍数.
  通常移动光标都是将其移动到开头和结尾  (1) 开头 f.seek(0)   (2) 结尾 f.seek(0, 2) # seek的第⼆个参数表⽰的是从哪个位置进⾏偏移, 默认是0, 表 ⽰开头, 1表⽰当前位置, 2表⽰结尾
 1 f = open("⼩娃娃", mode="r+", encoding="utf-8")
 2 f.seek(0) # 光标移动到开头
 3 content = f.read() # 读取内容, 此时光标移动到结尾
 4 print(content)
 5 f.seek(0) # 再次将光标移动到开头
 6 f.seek(0, 2) # 将光标移动到结尾
 7 content2 = f.read() # 读取内容. 什么都没有
 8 print(content2)
 9 f.seek(0) # 移动到开头
10 f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
11 f.flush()
12 f.close()
  2、tell()
    获取光标位置
  3、truncate() 截断文件
 1 f = open("娃娃", mode="w", encoding="utf-8")
 2 f.write("哈哈") # 写入两个字符
 3 f.seek(3) # 光标移动到3, 也就是两个字中间
 4 f.truncate() # 删掉光标后面的所有内容
 5 f.close()
 6 
 7 
 8 
 9 f = open("娃娃", mode="r+", encoding="utf-8")
10 content = f.read(3) # 读取12个字符
11 f.seek(4)
12 print(f.tell())
13 f.truncate(12) # 如果给了参数会以参数位置有限光标,参数后面的所有内容全部都删掉
14 # print(content)
15 f.flush()
16 f.close()

七、文件修改

1 import os
2 with open("娃娃", mode="r", encoding="utf-8") as f1,\     # \连接后面的语句
3  open("娃娃_new", mode="w", encoding="UTF-8") as f2:
4     for line in f1:
5     new_line = line.replace("", "冰糖葫芦")
6     f2.write(new_line)
7 os.remove("娃娃") # 删除源文件
8 os.rename("娃娃_new", "娃娃") # 重命名新文件

八、网络请求

1 import requests  # 导入网络请求包
2 re = requests.get('http://t2.hddhhn.com/uploads/tu/201610/198/jnrqtcnyywt.jpg')
3 f2 = open('e:/genren.jpg', mode='wb')
4 f2.write(re.content)
5 f2.flush()
6 f2.close()
7 print()

 

posted @ 2018-09-12 20:26  qi.hu  阅读(222)  评论(0编辑  收藏  举报