博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day07 -文件的基本操作
阅读量:6981 次
发布时间:2019-06-27

本文共 4439 字,大约阅读时间需要 14 分钟。

1、什么是文件?

文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位文件的操作核心就:读、写即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程序对文件的读写操作转换成具体的硬盘指令(比如控制盘片转动,控制机械手臂移动来读写数据)

2 为什么要有文件?

因为内存无法永久保存数据,但凡我们想要永久保存数据都需要保存到硬盘中,而操作文件就可以实现对硬件的操作

3、文件的读写模式

控制读写文件内容的结果有两种:t模式text,b模型bytes
1、t模式:文本文件模式
2、b模式:二进制模式
注意:
1、t与b这两种模式均不能单独使用,都需要与r/w/a之一连用
2、默认的内容格式是t
3、只有文本文件才能用t模式,也只有文本文件才有字符编码的概念

4、操作文件的三种模式:

(1)r:read,只读模式
  1、只能读,不能写
  2、在文件不存在时,会报错,在文件存在的时候会将文件指针移动到开头

1 b.txt内容如下: 2 啊啊啊啊 3 哈哈哈哈 4 呵呵呵呵 5  6 打开文件的2种方法 7  (1) 8 f=open(r'b.txt',mode='rt',encoding='utf-8') 9 (2)10 with open(r'b.txt',mode='rt',encoding='utf-8')as f:11 print(f.read()) #将文件的内容全部读出来12  print(f.readline(),end='')#一行一行读的话 需要在末尾加end = ''13  print(f.readline(),end='')#end = ''去除print末尾的空格14  print(f.readline(),end='')15  print(f.readlines()) #将文件内容打印出列表每个值的后面都有\n16  print(data)17  f.close()18 注意(1)方法必须要关闭,(2)方法不需要关闭
View Code

(2)

w:只写模式

  1、只能写,不能读
  2、在文件不存在时会创建空文件,在文件存在的时候会将文件内容清空

a:只追加写模式

  1、只能写,不能读
  2、在文件不存在时会创建空文件,在文件存在的时候会将指针移动到文件末尾

(1) f=open('d.txt',mode='at',encoding='utf-8')(2)with open('d.txt',mode='at',encoding='utf-8')as f f.read() f.write('555555\n6666\n') f.writelines(['77777\n','8888888\n','999999999\n']) f.close()#for 循环取值for line in f:    print(line)可以通过.strip('\n')构造一个有规律的字符串,然后通过.split(‘’)方法将取出的值编程一个一个列表 通过 for 循环 做进一步应用

拷贝文件的操作(with的另外一种用法)

(1)

with open('e.txt','rb') as f,open('j.txt','wt',encoding='utf-8') as f1:

src_data=f.read()

res=src_data.decode('utf-8')

f=open('c.txt',mode='rb') f.seek(-9,2) print(f.readline().decode('utf-8')) print(f.tell()) f.close()

  

print(res,type(res))

f1.write(res)

(2)

with open('e.txt','rb') as f,\

  open('j.txt','wb') as f1:
  f1.write(f.read())

5、文件操作的其他方法:

1、与t模式结合使用

(1)r+t 可读、可写 (2)w+t 可写、可读(3)a+t 可追加写、可读

2、与b模式结合使用

(1)r+b 可读、可写(2)w+b可读、可写 (3)a+t 可追加写、可读

#注关于b模式的文本文件: 写入时候需要encode 读取文件时候需要decode

 

1,b模式写入 with open('b.txt',mode='rb') as f:    data=f.read()    #如果想要看到文件中的具体内容需要decode    print(data.decoding('utf-8'))2、b模式读取with open('b.txt',mode='wb') as f:    f.write('123\n'.encode('utf-8')

3、

f.seek(offset,whence)

offset代表文件的指针的偏移量,单位是字节bytes
whence代表参考物,有三个取值
0:参照文件的开头
1:参照当前文件指针所在位置
2: 参照文件末尾
ps:快速移动到文件末尾f.seek(0,2)  

1(0)

f=open('c.txt',mode='rt',encoding='utf-8')f.seek(9,0)print(f.tell())  #每次统计都是从文件开头到当前指针所在位置print(f.readline())f.close()

 2(1)

f=open('c.txt',mode='rb') f.readline() f.seek(6,1) print(f.readline().decode('utf-8')) print(f.tell()) f.close()

 3(2)

f=open('c.txt',mode='rb') f.seek(-9,2) print(f.readline().decode('utf-8')) print(f.tell()) f.close()

6、文件修改、拷贝

1 修改文件内容的方式一: 2 思路:先将原文件内容一次性全部读入内存,然后在内存修改完毕后,再 3 覆盖写回原文件 4 优点:在修改期间,文件内容只有一份 5 缺点:当文件过大的情况下或占用过多的内存空间 6  7  with open('d.txt','rt',encoding='utf-8') as read_f: 8      msg=read_f.read() 9      msg=msg.replace('alex','xiang')10       print(msg)11 12  with open('d.txt','wt',encoding='utf-8') as write_f:13      write_f.write(msg)14 15 修改文件内容的方式二:16 思路:17 1、以读的方式打开原文件,以写的方式打开一个新文件18 2、从原文件中循环读取每一行内容修改后写入新文件19 3、删除原文件,将新文件重命名为原文件的名字20 21 优点:同一时刻只有一行内容存在于内存中22 缺点:在修改期间,文件内容始终存在两份,但修改完毕后会只留一份23 import os24 with open('d.txt','rt',encoding='utf-8') as read_f,\25         open('d.txt.swap','wt',encoding='utf-8') as write_f:26     for line in read_f:27         write_f.write(line.replace('xiang','ALEXSB'))28 29 os.remove('d.txt')  删除老文件30 os.rename('d.txt.swap','d.txt')31 32 33  with open('info.txt',mode='rt',encoding='utf-8')as f:34      f.seek(9,0)
View Code

7,知识点代码总结

1 #1、 2 with open('info.txt',mode='rt',encoding='utf-8')as f: 3      f.seek(9,0) 4      print(f.readline()) #愿意跟我去吃鸡么 5  6      f.seek(35,0) 7      print(f.readline())#滚 8 #2、 9  with open('info.txt', mode='rb')as f: #1,2模式只能在b模式下使用10      f.readline()11      f.seek(6,1)12      print(f.readline().decode('utf-8')) i am wcl13      f.seek(-5,2)14      print(f.readline().decode('utf-8')) study15 #3、16  with open('info.txt',mode='rb',encoding='utf-8')as f:17      print(f.read(4)) 哈喽,愿18 19  with open('info.txt',mode='rb') as f2:20      print(f2.read(3))21 22  with open('1.txt',mode='r',encoding='utf-8') as f1: #先全部读出来23      data =f1.read()24      data = data.replace('i','y')25  with open('2.txt',mode='w',encoding='utf-8') as f1:# 赋值给一个变量在写入一个新的文件26      f1.write(data)27 #4、28  import os29  with open('2.txt',mode='r',encoding='utf-8')as f ,open('222.txt',mode='w',encoding='utf-8')as f1:30      for line in f:31          f1.write(line.replace('i','y'))32  os.remove('2.txt')33  os.rename('222.txt','1.txt')
View Code

 

转载于:https://www.cnblogs.com/wcl0517/p/9136353.html

你可能感兴趣的文章
Vim案例两则
查看>>
函数式编程学习之路(一)
查看>>
Win7安装VC++6.0已知的兼容性问题的解决方法
查看>>
数据库连接oracle 10g rman 备份与恢复 之一
查看>>
asp.net开源CMS推荐
查看>>
Android实现自定义的 时间日期 控件
查看>>
查找删除Code First Entity Framework基本与最佳添加(add/create),删除(delete/remove),修改(update/modify)操作...
查看>>
fsetpos() fgetpos()详解
查看>>
javaScript之数组Array
查看>>
seajs 的研究二 -- 无题
查看>>
数据范围BZOJ 3209(花神的数论题-数位统计+1,被数据范围坑了)
查看>>
系统性能调优(5)----Java循环与字符串代码优化
查看>>
spring InitializingBean接口
查看>>
桥牌笔记-防止阻塞
查看>>
crudandroidandroid——CRUD(在上一篇博客的基础上)
查看>>
oracle的to_char中的fm
查看>>
[置顶] SQL注入安全分析
查看>>
Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错
查看>>
求两个字符串的最长公共字串(连续)
查看>>
菜鸟学Java(七)——Ajax+Servlet实现无刷新下拉联动
查看>>