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(),但是读取的内容按行转换成列表,列表元素包含换行符

  只写模式示例

[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
")
f.write("world
")

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

  下面打开一个终端操作

>>>f=open("/tmp/2.txt","w")    # 如果有文件则清空文件内容,如果文件不存在则创建文件
>>> f.write("hello
")    # 往文件写入内容加回车,默认不加回车
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
")  # 在文件尾部追加
>>>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
")
f.write("22222
")
f.write("33333
")
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