Day2-文件操作

文件操作流程:

1.打开文件,得到文件句柄并赋值给一个变量;

2.通过句柄对文件进行操作;

3.关闭文件

################################33

1.打开文件方法:

a.只读方式打开文件

 1 f = open("yesterday",encoding="utf-8")
 2 data = f.read()
 3 data2 = f.read()
 4 print(data)
 5 print(‘-----------data2------%s‘%data2)
 6
 7 执行结果:
 8 就如夜晚的微风
 9 May tease the candle flame
10 ...
11 When I was young
12 当我年少轻狂
13 -----------data2------

windows默认是gbk的编码格式,python默认是utf-8,如果不指定就使用操作系统的方式打开.文件指针,已经把data从开头读到最后,指针在最后了,所以第二个print只打印------data2----.

而且data属于文件内容,read()方法会打开全部内容,没法对文件进行操作。

正确的打开方式:

1 f=open("yesterday",‘r‘,encoding="utf-8")    #以只读r方式utf-8的编码方式打开文件,不写默认是只读,但顺序必须在这
2 data=f.read()
3 print(data)

b."写"的方式打开文件

1 f=open("yesterday2",‘w‘,encoding="utf-8")
2 f.write("我爱北京天安门,\n")
3 f.write("天安门上太阳升")
4 f.close()
5
6 执行结果:
7 生成yesterday2,内容如下
8 我爱北京天安门
9 天安门上太阳升

c."追加"方式打开文件

1 f=open("yesterday2",‘a‘,encoding="utf-8")   # a =append追加
2 f.write("我爱北京天安门,。。。。。。\n")
3 f.write("天安门上太阳升。。。。")
4 f.close()
5
6 执行结果:
7 天安门上太阳升我爱北京天安门,。。。。。。
8 天安门上太阳升。。。。

d.只读前几行

 1 yesterday2-----------------
 2 我爱北京天安门,
 3 天安门上太阳升我爱北京天安门,。。。。。。
 4 天安门上太阳升。。。。
 5 -----------------------------------------------------------
 6 f = open("yesterday2",‘r‘,encoding="utf-8")
 7 for i in range(3):
 8     print(f.readlines())
 9
10 执行结果:
11 [‘我爱北京天安门,\n‘, ‘天安门上太阳升我爱北京天安门,。。。。。。\n‘, ‘天安门上太阳升。。。。‘]
12 []
13 []

1 f = open("yesterday2",‘r‘,encoding="utf-8")
2 for line in f.readlines():
3     print(line)
4 执行结果:
5 我爱北京天安门,
6
7 天安门上太阳升我爱北京天安门,。。。。。。
8
9 天安门上太阳升。。。。

1 f = open("yesterday2",‘r‘,encoding="utf-8")
2 for line in f.readlines():
3     #print(line)
4     print(line.strip())  #strip()是把空格和换行符去掉
5
6 执行结果:
7 我爱北京天安门,
8 天安门上太阳升我爱北京天安门,。。。。。。
9 天安门上太阳升。。。。

e.举例:yesterday文件前9行插入“---我是分割线---”,文件正常打印

 1 f = open("yesterday",‘r‘,encoding="utf-8")
 2 for index,line in enumerate(f.readlines()):
 3     if index == 9:
 4         print(‘--------我是分隔线----------‘)
 5         continue
 6     print(line.strip())
 7
 8 执行结果:
 9 就如夜晚的微风
10 May tease the candle flame
11 ...
12 (第9行)--------我是分隔线----------
13 ...
14 When I was young
15 当我年少轻狂

问题:

如果文件是20G大小,从硬盘读到内存中,内存就8G,程序就卡住了,内存就撑爆了,f.readlines读一行存在内存中一行,所以f.readlines只适合读小文件。上面是很low的写法.
解决方案:循环一行,删除一行,即内存中只保存一行
f.正确的循环打开方式

1 f = open("yesterday",‘r‘,encoding="utf-8")
2 for line in f:
3     print(line.strip())
4 #这种方式,一行一行的读,并且内存中只保留一行,效率最高

举例:只修改第9行,即原第9行不打印了

1 f=open("yesterday",‘r‘,encoding=‘utf-8‘)
2 count=0
3 for line in f:
4     count += 1
5     if count==9:
6         print(‘---------我是分割线----‘)
7         count+=1   #count加1,否则下一条语句continue会把count一直是9,跳不出去
8         continue  #直接跳到for第10行开始,循环执行即print打印第10行
9     print(line.strip())

2.文件句柄的增删改查

句柄tell、seek:

1 f = open("yesterday",‘r‘,encoding="utf-8")
2 print(f.tell())
3 0
4 print(f.read(5)) #打印前5个字符,即前5位
5 就如夜晚的
6 print(f.tell())   #tell()方法以字符进行计位的
7 15

 1 f = open("yesterday",‘r‘,encoding="utf-8")
 2 print(f.tell())  #打印当前位置
 3 0
 4 print(f.readline())
 5 就如夜晚的微风
 6 print(f.readline())
 7 May tease the candle flame
 8 print(f.readline())# 一下读取三行
 9 逗弄蜡烛的火苗
10 print(f.tell())
11 74
12 f.seek(0)   #文件指针又回到文件第一行
13 print(f.readline())  #查看到f又开始读取第一行
14 就如夜晚的微风
15
16 print(f.encoding)  #打印文件的编码
17 utf-8
18 print(f.fileno()) #操作系统内部有个接口打开文件,在操作系统的编号,不用,不关注
19 3
20 print(f.flush()) #执行语句时,先写到内存的buffer缓存,达到缓存的大小才会写入硬盘,用途是存钱时存一次刷到硬盘一次
21 None

f.flush()方法:f.write()方法是写入内存的buffer,f.flush是把缓存中的内容写入到磁盘

1 >>> f = open("test.text","w")  #在D盘下创建test.text文件
2 >>> f.write("hello1\n")  #写入hello1字符串
3 7
4 >>> f.flush()   #flush后才会有,即f.write是写入内存中的
5 >>> f.write("hello2\n")
6 7
7 >>> f.flush()

举例:打印进度条

1 import sys,time
2 for i in range(50):
3     sys.stdout.write("#")  #sys的标准输出
4     sys.stdout.flush()
5     time.sleep(0.1) #秒
6
7 ##################################################

截断:指针从第10位到第20位的字符

1 f = open("yesterday",‘a‘,encoding=‘utf-8‘)
2 f.seek(10)  #指针移动到第10位
3 f.truncate(20) #截取从第11位到第20位字符
4
5 执行结果:
6 我爱北京天安门,天安

读写r+:以只读和追加的方式打开

 1 f=open("yesterday2",‘r+‘,encoding=‘utf-8‘)  #读写:只读和追加的方式打开
 2 print(f.readline())
 3 print(f.readline())
 4 print(f.readline())#指针到第三行
 5 print(f.seek())
 6 f.write("----------diao------")  #虽然指针在第3行,但还是在最后追加
 7 print(f.readline())
 8
 9 执行结果:
10 yesterday2最后一行添加----------diao------

写读w+:创建新文件,既可以写,又可以读。(结论:python2.7上这样就把源文件的字符修改掉变成新的,而python3不支持修改了。)

 1 f=open("yesterday3",‘w+‘,encoding=‘utf-8‘)
 2 f.write("-------------diao---------\n")
 3 f.write("-------------diao---------\n")
 4 f.write("-------------diao---------\n")
 5 f.write("-------------diao---------\n")
 6 print(f.tell())
 7 112
 8 f.seek(10)
 9 print(f.tell())
10 10
11 print(f.readline())
12 ---diao---------
13 f.write("shouldbeatthebeginingofthesecondlien")
14 f.close()
15
16 执行结果:
17 生成yesterday3文件,文件内容
18 -------------diao---------
19 -------------diao---------
20 -------------diao---------
21 -------------diao---------
22 shouldbeatthebeginingofthesecondlien

总结:

写读模式没用,读写模式可以打开文件可以追加内容。
f=open("yesterday2",‘r+‘,encoding=‘utf-8‘) #文件句柄,读写模式
f=open("yesterday2",‘w+‘,encoding=‘utf-8‘) #文件句柄,写读模式
f=open("yesterday2",‘a+‘,encoding=‘utf-8‘) #文件句柄,追加读模式(追加模式下不能读,a+可以读了)
f=open("yesterday2",‘rb‘,encoding=‘utf-8‘) #文件句柄,二进制文件(二进制的方式去读)

f=open("yesterday2",‘rb‘,encoding="utf-8")
print(f.readline())
ValueError: binary mode doesn‘t take an encoding argument(二进制模式不能传递encoding编码了)

二进制读:
f=open("yesterday2",‘rb‘)
print(f.readline())
b‘-------------diao---------\r\n‘(b代表字节byte类型,windows上都是\r\n)
rb用途:
1.网络传输:socket传输(client--server传输文件,python3只能用二进制格式,python2还能用字符)
二进制写:
f=open("yesterday2",‘wb‘)
f.write("hello binary\n".encode()) #字符串转换成bytes
f.close()
Hello binary 文件内部以二进制存储

windows的换行是\r\n,linux是\n.

 1 打开文件的模式有:
 2
 3 r,只读模式(默认)。
 4 w,只写模式。【不可读;不存在则创建;存在则删除内容;】
 5 a,追加模式。【可读;   不存在则创建;存在则只追加内容;】
 6 "+" 表示可以同时读写某个文件
 7
 8 r+,可读写文件。【可读;可写;可追加】
 9 w+,写读
10 a+,同a
11 "U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
12
13 rU
14 r+U
15 "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
16
17 rb
18 wb
19 ab

文件修改:python3上不支持在源文件上修改,现在流行两种修改文件的方式:

1.vim打开文件,是把文件内容加载到内存中,修改完后再写回源文件;(缺点:2G的文件就没法玩了)
2.打开文件,修改文件后保存到另外一个文件中;(建议使用,方法为同时打开两个文件,边读边写,修改的话是打开文件替换后另存到新文件中)

举例说明:

 1 f = open("yesterday2",‘r‘,encoding="utf-8")
 2 f_new = open("yesterday4",‘w‘,encoding="utf-8")
 3 for line in f:
 4     if "文件yesterday2中的一行字" in line:
 5         line = line.replace("文件yesterday2中的一行字","文件yesterday4中的一行字")
 6         f_new.write(line)
 7 f.close()
 8 f_new.close()
 9
10 执行结果:
11 创建新文件yesterday4,并写入
12 文件yesterday4中的一行字

with语句----------------------------------------

作用:

1.自动回收内存,自动关闭文件,释放文件资源;

2.与open区别是文件自动写入磁盘,而open方法是写入内存,必须flush后才能写入磁盘;

1 with open("yesterday2","r",encoding="utf-8") as f:
2     for line in f:
3         print(line)
4 #open后没有关闭文件,但with就会自动关闭了

在python2.7之后,with支持多文件的上下文管理,即

1 with open("yesterday2",‘r‘,encoding="utf-8") as f, 2     open("yesterday3",‘r‘,encoding="utf-8"):
3     for line in f:
4         print(line)

 

时间: 2024-10-25 20:56:30

Day2-文件操作的相关文章

Python Day2 基础 操作文件流

1.列表.元组 操作                                                                    推荐书籍    追风筝的人       白鹿原   琳达看美国 2.字符串操作 3.字典操作 4.集合操作 5.文件操作 6.字符编码和转码 7.内置函数 列表,元祖 列表   name = [2,3,4,3]   name.copy()  浅copy        import copy      name2=cooy.deepndcopy

Python全栈之路4--内置函数--文件操作

上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对象,类名) 判断变量输入的对象是否是属于这个类 # 方法1: temp = [11, 22, "", " ", []] print(isinstance(temp, (str, list, tuple))) # 一旦对象属于这个后面元组的类中的任何一个 就返回true

实现购物车功能 --- 文件操作版

1.用户接口 >>>判断用户工资是否有记录 >>>能够从文件中读取商品列表 >>>能够选择想要的商品,并扣除工资 >>>打印并保存订单信息以及工资余额 2.商家接口 >>>能够读取商品列表 >>>能够修改商品价格并保存 >>>能够添加商品并保存 >>>能够删除商品并保存 3.代码实现 shopping_cart.py '''实现购物城功能---文件操作版'''#

python学习列表字符串字典集合文件操作字符串编码与转换

一.列表 1 names = "ZhangYang GuYun XiangPeng XuLiangchen" 2 names = ["ZhangYang", "GuYun", "XiangPeng", "ChengRongHua","XuLiangchen"] 3 names.append("LeiHaiDong") #在列表最后追加一个元素 4 names.inse

Python 文件操作

操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读: 不存在则创建:存在则只追加内容:] "+" 表示可以同时读写某个文件 r+,可读写文件.[可读:可写:可追加] w+,写读 a+,

python基础:python循环、三元运算、字典、文件操作

目录: python循环 三元运算 字符串 字典 文件操作基础 一.python编程 在面向过程式编程语言的执行流程中包含: 顺序执行 选择执行 循环执行 if是条件判断语句:if的执行流程属于选择执行:if语句有三种格式,如下: 在多分支的if表达式中,即使多个条件同时为真,也只会执行一个,首先测试为真: 选择执行 单分支的if语句 if CONDITION: 条件为真分支 双分支的if语句 if CONDITION 条件为真分支 else 条件不满足时分支 多分支的if语句 if CONDI

python文件操作

文件操作:os.mknod("test.txt")        创建空文件fp = open("test.txt",w)     直接打开一个文件,如果文件不存在则创建文件 关于open 模式: w     以写方式打开,a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)r+     以读写模式打开w+     以读写模式打开 (参见 w )a+     以读写模式打开 (参见 a )rb     以二进制读模式打开wb     以二进制写模式打

Python基础(六) 基础文件操作

今天学习python下对文件的基础操作,主要从open函数.File对象的属性.文件定位.简单操作.举例说明几个步骤开始学习,下面开始进入今天的主题: 一.open函数介绍 open函数主要是打开一个文件,创建一个file对象,相关的方法可以调用它进行读写 . 语法格式如下: 1 2 3 file object = open(文件名,打开文件的模式) file object  = with open (文件名,打开文件的模式) as 变量名 两种语法格式的不同在于下面这种方法不用输入f.clos

小何讲Linux: 基本文件操作和实例

文件操作的基本概念参见博客: 小何讲Linux: 底层文件I/O操作 1.  函数说明 open()函数:是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数. 所谓打开文件实质上是在进程与文件之间建立起一种连接,而"文件描述符"唯一地标识着这样一个连接 close()函数:是用于关闭一个被打开的文件.当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件. read()函数:是用于将从指定的文件描述符中读出的数据

C语言中的文件操作---重定向操作文件

先说个题外话,文件操作以及字符串与字符深入处理(就是那些什么puts(), getchar()什么的)是本人深入认识C++最后的两座大山.而今天先把重定向文件操作解决掉. 输入输出重定向恐怕是文件I/O操作中最简单的方法了,具体用法是现在main函数的开头加入两条语句,例如: freopen("D:\\input.txt", "r", stdin); freopen("D:\\output.txt", "w", stdout)