1,先open打开一个要操作的文件
2,操作此文件(读,写,追加)
3,close关闭此文件
python主要访问模式
创建一个测试用文件
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()
原文:https://www.cnblogs.com/minseo/p/13894751.html