python-文件读写

文件做的就是持久化保存数据 -> 文件保存硬盘或者磁盘
内存的数据只有在程序运行时候存在

对文件操作流程
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件

# data = open("test_file").read()
data = open("test_file",encoding="UTF-8").read()  #有的操作系统编码格式是gdk,python3是UTF-8,读取不了,所以➕encoding默认读取格式为UTF-8
print(data)
访问模式说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

以下面这个文件来进行读取

只读

如果使用r模式打开文件 如果文件存在 直接打开
如果文件不存在 会报错

f = open("test_file",encoding="UTF-8")  #文件句柄,就是这个文件的内存对象,包含文件的名字、字符集、大小等
data = f.read()
data2 = f.read()
print(data)
print('data2',data2)   #data2读不到,data读到最后一行,data2是继续读,所以读不到。文件一遍读完就没了

 

f = open("../test_file1.txt", "r")
ret = f.read(4)  # 读了前4个字符
print(ret)
ret = f.read(4)  # 从上次读后的位置又读了4个字符
print(ret)
f.close

 

 

f = open(file_name, "r")
# 读取数据
# 把每行的数据保存到列表中
ret = f.readlines()
print(ret)  # 列表的每个元素后会多一个\n
f.close()

 

 

f = open("test_file2",'r',encoding="UTF-8")
# print(f.readlines())  #读出来是个列表,每行一个元素
for line in f.readlines():
    print(line.strip())  #默认每行后面都有一个换行符,strip去掉空格和换行

 

f = open("test_file2", 'r', encoding="UTF-8")
print(f.readline())  # 读一行
# 读多行
for i in range(5):
    print(f.readline())

 

只写

如果使用w模式打开文件 如果文件存在 直接打开 会吧原来文件的数据清空
如果文件不存在 会创建一个文件,然后打开

默认情况下如果在windows电脑中(中国)保存中文,编码方式是gdk(mac电脑或者linux没有问题)

如果其他字符 例如abcd 编码方式为utf-8

f = open("test_file2",'w',encoding="UTF-8")  #没有写,默认就是r,读模式;w写,是创建一个文件,会覆盖之前的,这个只能写,不能读;
f.write("桃之夭夭,灼灼其华。之子于归,宜其室家。\n") 
f.write("桃之夭夭,有蕡其实。之子于归,宜其家室。")

追加

f = open("test_file2",'a',encoding="UTF-8")  #a往后追加,不覆盖原来的文件,也不能读;
f.write("\n桃之夭夭,其叶蓁蓁。之子于归,宜其家人。")
f.close()

当文件使用完毕后 请关闭文件(打开一个文件就需要消耗内存)
f.close()
无论以什么方式打开文件 都记得关闭文件

f = open("test_file",'r',encoding="UTF-8")
#第10行不打印
#low loop
for index,line in enumerate(f.readlines()):  #这个只适合文件不大的情况
    if index == 9:
        print("------分割线-------")
        continue
    print(line.strip())
f = open("test_file",'r',encoding="UTF-8")
#高效的循环方法
count = 0
for line in f:   #一行一行读,内存每次只存一行
    if count == 9:
        print("-------分割线------")
        count += 1
        continue
    print(line)
    count += 1
f.close()
f = open("test_file", 'r')
print(f.tell())  # 指针所在位置
print(f.readline())
print(f.tell())  # tell是按字符计数的
f.seek(0)  # 指针回到0
print(f.encoding)  # 查看文件编码
print(f.name)  # 查看文件名字
print(f.readable())  # 判断文件是否可读
print(f.writable())  # 判断文件是否可写
print(f.closed)  # 判断文件是否关闭,返回true/false

yayadeMac:~ ddc-test$ python3
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("/Users/ddc-test/Downloads/pycharm/Ex_user/test_file2","w")
>>> f.write("hello1\n")         #写入之后,打开文件并没有
7
>>> f.flush()     #打开之后有,实时刷新
>>>

以进度条为例:

import sys,time
for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush()   #如果不写这一行就是等缓存区满了一下刷出来
    time.sleep(0.1)
f = open("test_file2",'a',encoding="UTF-8")
# f.truncate()   #截断,不写会清空
f.seek(15)
f.truncate(21)  #从头开始截断,移动光标不好使

读写

f = open("test_file2",'r+')
print(f.readline())
f.write("-----------")   #依然写在了最后,读和追加的功能
print(f.readline())

写读

f = open("test_file2",'w+')   #先创建一个文件
print(f.readline())      #初始空
f.write("-----1------\n")
f.write("-----2------\n")
f.write("-----3------\n")
f.write("-----4------\n")
f.seek(10)
print(f.readline())
f.write("hhhhhhhhh")    #依然在最后追加

追加读写

f = open("test_file2",'a+')

二进制

文件是以二进制编码的


f = open("test_file2",'rb')   #二进制文件,以二进制格式读,这时不能传encoding
f = open("test_file2",'wb')
f.write("hello binary\n".encode())
f = open("test_file2",'ab')

文件修改

f = open("test_file2",'r')
f_new = open("test_file2.bak",'w')
for line in f:
    if "桃之夭夭" in line:
        line = line.replace("桃之夭夭","替换内容")
    f_new.write(line)
f.close()
f_new.close()

with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即
with open('log','r') as f:
  ...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
支持同时对多个文件的上下文进行管理,即:
with open('log1','r') as obj1,open('log2','r') as obj2:
  Pass

with open("test_file2",'r') as f:
    print(f.readline())
#with这段语句执行完毕后自动关闭文件
with open("test_file1",'r') as f1,\
     open("test_file2", 'r') as f2:

文件备份

# 做备份文件 -> 伪代码
# 01 打开hm.txt文件
old_f = open("hm.txt", "r")
# 02 读取hm.txt文件的数据
result = old_f.read()
# 03 创建一个hm[复件].txt文件
new_f = open("hm[复件].txt", "w")
# 04 把从hm.txt读取的数据写入到hm[复件].txt文件中
new_f.write(result)
# 05关闭文件
old_f.close()
new_f.close()

posted @ 2019-12-03 17:12  忆梦,惊梦  阅读(661)  评论(0编辑  收藏  举报