python循环写文件时、io需不需要关闭_Python文件IO操作

十五,pytho文件IO操作

python文件操作的步骤

1,先open打开一个要操作的文件

2,操作此文件(读,写,追加)

3,close关闭此文件

python主要访问模式

只读模式(r)

创建一个测试用文件

cat /etc/passwd |head -5>/tmp/1.txt

只读模式示例

# 只读模式示例

f = open("/tmp/1.txt", mode="r") # 默认为读模式

data1 = f.read() # 读第一遍

data2 = f.read() # 读第二遍

print(data1) # 打印读取第一遍的输出即文件所有内容

print("="*50)

print(data2) # 第二次读取没有内容

f.seek(10) # 移动光标指针位置至位置10 一个字符占用一个位置

print(f.tell()) # 打印指针位置

print(f.readline())

data2 = f.read()

print(data2)

f.close()

小结

r模式是打开文件,默认光标在第1位,即seek(0)

read()读取当前光标至文件最后

readline()读取当前光标至当前行最后

readlines()类似read(),但是读取的内容按行转换成列表,列表元素包含换行符\n

只写模式示例

[root@node1 python]# cat 只写模式.py

f = open("/tmp/1.txt","w") # 只写模式,文件不存在则创建文件,如果文件存在则会覆盖原内容

# data=f.read()# 读取会报错

f.close()

f = open("/tmp/2.txt","w")

f.write("hello\n")

f.write("world\n")

只写模式示例 创建新文件并写入内容

下面打开一个终端操作

>>>f=open("/tmp/2.txt","w") # 如果有文件则清空文件内容,如果文件不存在则创建文件

>>> f.write("hello\n") # 往文件写入内容加回车,默认不加回车

6 # 返回写了多少给字符,这时候文件内容还是为空除非是flush或者close

>>>

>>>f.truncate()# 截断,括号里没有数字,那么就是不删除

>>>f.truncate(3)# 截断,数字为3,就是保留前3个字节

>>>f.truncate(0)# 截断,数字为0,就是全删除

>>>f.flush() #刷新把内存睡觉写入到硬盘

>>>f.close() #关闭

追加模式

>>>f=open("/tmp/2.txt",'a')# 类似shell里的>>符

>>>f.write("hello\n")  # 在文件尾部追加

>>>f.flush()

>>>f.truncate(0) # 追加模式可以是否truncate方法清空文件

>>>f.close()

注意

扩展:1,但python里的a模式,是可以使用truncate方法来清空内容的

2,在linux系统里执行了下面命令后,则就只能追加此文件,而不能清空此文件内容# chattr +a /tmp/2.txt

3,如果在linux系统里做了chattr+a/tmp/2.txt后,在python里再用w或a模式open此文件,就不可以使用truncate方法来清空内容了(因为python允许你这么做,但linux系统拒绝了)

文件读的循环方法

f = open("/tmp/1.txt", "r")

# 循环方法一

for index, line in enumerate(f.readlines()):

print(index, line.strip())

f.close()

# 循环方法二:执行效率高,相当于一行一行的读,而不是一次性读取完

# 如果文件太大使用方法一循环速度会很慢

f = open("/tmp/1.txt", "r")

for index, line in enumerate(f):

print(index, line.strip())

f.close()

~

比较r+,w+,a+三种模式

r+不会改变原文件的数据,相当于在只读模式的基础上加了写权限;

w+会清空原文件的数据,相当于在只写模式的基础上加了读权限;

a+不会改变原文件的数据,相当于在只追加模式的基础上加了读权限

示例

f = open("/tmp/2.txt", "w+")

f.write("11111\n")

f.write("22222\n")

f.write("33333\n")

print(f.tell()) # 打印结果为18,表示光标在最后

f.write("aaa") # 在文件后追加aaa字符

print(f.tell())

f.seek(0) # 把光标移动到0也就是第一个字符

f.write("bbb") # f.seek(0)之后再写bbb,就是把第一行的前3个字符替换成bbb 第一行变成了bbb11

f.seek(0) # 把光标再次移动到0

f.readline() # 读取一行,读光标移动到第一行最后

f.seek((f.tell())) # f.seek到第一行最后 如果理解为两个光标的话,可以看作是把写光标同步到读光标位

f.write("ccc") # 这样写ccc,会把第二行的前3个字符替换成ccc

f.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值