Python修炼之路-文件操作
Posted 徘徊的游鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python修炼之路-文件操作相关的知识,希望对你有一定的参考价值。
文件操作流程:
打开文件,得到文件句柄并赋值给一个变量
通过句柄对文件进行操作
关闭文件
每次文件打开、读取信息时,Python自动记录所达到的位置,好比一个书签,之后每一次读取都会从上次结束的地方开始,如果要从开始的位置读取,可以将其关闭后打开。
文件操作模式:r :只读模式 (默认)
w :只写模式 (不可读;如果文件不存在,则创建新文件;如果文件存在,则删除原内容)
a :追加模式 (不可读;如果文件不存在,则创建新文件;如果文件存在,则在文件末追加内容)
+ 表示可以同时读写某个文件:
r+ : 可读可写,追加形式写入,读取行位置不变
w+ : 写读,覆盖形式写入,此时在文件最后,如果需要读取文件,则需要使用seek
a+ : 可读可写,追加形式写入,以这个模式打开文件,默认在文件末尾,如果需要读取文件,则需要使用seek
b: 处理二进制文件 (FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
在socket编程中,python3.x以二进制传输,需要encode,python2.x可以通过字符串传输
rb: 二进制形式读取文件,注意此时不能有encoding = "utf-8",会报错ValueError。
wb:
ab:
U:表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU:
r+U:
文件缓存:写入文件时,可能写入内容还在缓存中,并没有写进硬盘,可以通过flush方法冲刷缓存,写进硬盘中。
with语句:当with代码块执行完毕时,内部会自动关闭并释放文件资源。
python2.7之后,with支持同时对多个文件的上下文管理。
文件读写操作
1 #*************************读************************ 2 #默认读取,则整个文件以字符串形式返回 3 f = open("file","r",encoding="utf-8") #文件句柄,输出中文时注意文件编码 4 data = f.read() #读取剩下的所有内容,文件大时不建议使用 5 data2 = f.read() #此时文件已经读取完,书签在文件末,data2中为空 6 print(data) 7 print("---------------") 8 print(data2) 9 f.close() 10 11 #按指定字符数 12 f = open("file","r",encoding="utf-8") 13 print(f.read(1)) 14 print(f.read(4)) 15 f.close() 16 生 17 当作人杰 18 19 #按行读取 20 f = open("file","r",encoding="utf-8") 21 print(f.readline()) 22 print(f.readline()) 23 f.close() #原文档有回车,所以有一个空行 24 25 f = open("file","r",encoding="utf-8") 26 lines = f.readlines() 27 print(lines,len(lines)) 28 f.close() 29 [‘生当作人杰\n‘, ‘死亦为鬼雄\n‘, ‘至今思项羽\n‘, ‘不肯过江东‘] 4 30 31 #for循环迭代 32 f = open("file","r",encoding="utf-8") 33 for line in f: #一行一行的读,效率比较高 34 print(line) 35 f.close() 36 37 #模块自动关闭文件 38 with open(‘file‘,‘r‘,encoding="utf-8") as f: 39 print(f.read()) 40 41 42 43 #*****************写******************* 44 text_file = open("write_it.txt","w") #会自动创建一个新文件,原来如果有个这个文件,则会覆盖,慎用 45 text_file.write("Line 1\n") 46 text_file.write("This is line 2\n") 47 text_file.write("That makes this line 3\n") 48 49 #将字符串列表写入到文件 50 text_file = open("write_it.txt","w") 51 lines = ["Line \n", 52 "This is line 2\n", 53 "That makes this line 3\n"] 54 text_file.writelines(lines) 55 text_file.close()
文件追加与修改操作
1 #*****************追加******************* 2 f = open("file","a",encoding="utf-8") #在文件后追加信息,注意使用“\n” 3 f.write("\n李清照") 4 f.close() 5 6 #**********************可读可写模式****************** 7 f = open("file","r+",encoding="utf-8") #文件句柄,输出中文时注意文件编码 8 data = f.read() #读取剩下的所有内容,文件大时不建议使用 9 f.write("\n南宋") 10 f.close() 11 12 #**********************修改文件****************** 13 f = open("file","r",encoding="utf-8") #文件句柄,输出中文时注意文件编码 14 f_new = open("file.bak","w",encoding="utf-8") 15 for line in f: 16 if "西天的云彩" in line: 17 line = line.replace("西天的云彩","今天的离别") 18 f_new.write(line) 19 f.close() 20 f_new.close() 21 #结论:通过匹配要修改的内容修改,保存在另外一个新建文件中。
文件其他操作
1 #**********文件的其他用法******************** 2 f = open("file","r",encoding="utf-8") 3 print(f.tell()) #tell 返回文件当前位置,按字节计算 4 date = f.readline() 5 date = f.readline() 6 print(f.tell()) 7 f.seek(15) #seek 移动到文件某个字符位置,一个汉字为3个字节 8 #seekable 是否可以移动,tty文件不可以 9 print(f.readline()) 10 print(f.encoding) #encoding 返回文件编码 11 print(f.fileno()) #fileno 调用操作系统哪个接口 12 print(f.flush()) #flush 冲刷文件的内部缓存 13 f.truncate(10) #从头开始截断,原文件只剩下10个字符,不指定参数会清空原文件, 14 f.close()
二进制文件操作
1 #***************二进制读写******************** 2 f = open("file","rb") #文件句柄,输出中文时注意文件编码 3 print(f.read()) 4 f.close() 5 #b‘hello world‘ 6 7 f = open("file","wb") #文件句柄,输出中文时注意文件编码 8 f.write("Hello world\n".encode()) 9 f.close()
with语句操作
1 #*********************with语句********************* 2 3 with open("loginlog.txt","r") as f: 4 for line in f: 5 print(line) #代码块执行完毕后会自动关闭文件 6 7 #with打开多个文件 8 with open("loginlog.txt","r") as f,\ #python代码规范,一行尽量不要超过80个字符,建议用\换行 9 open("1111","r") as f2: 10 for line in f: 11 print(line)
文件操作问题
1 #***********************文件操作问题****************** 2 #文件内容: abcdefghijklmno 3 #**************模式:r+************************ 4 f = open("file","r+",encoding="utf-8") 5 print("初始位置:", f.tell()) 6 data2 = f.read(5) 7 print("-------%s-------" % (data2) ) 8 print("读取五个字母之后的位置:", f.tell()) 9 f.write("a") 10 print("写入一个字母之后的位置:", f.tell()) 11 data = f.read(5) 12 print("-------%s-------" % (data) ) 13 print("再次读入五个字母之后的位置:", f.tell()) 14 f.close() 15 初始位置: 0 16 -------abcde------- 17 读取五个字母之后的位置: 5 18 写入一个字母之后的位置: 19 #追加 19 -------fghij------- #从第6个位置开始读 20 再次读入五个字母之后的位置: 19 21 #结论:读取正常,在文件末尾添加,但是继续读取和tell()返回的值不一致 22 #问题:如果先写再读,则不是追加,会从文件开始覆盖增加 23 f = open("file","r+",encoding="utf-8") #文件句柄,输出中文时注意文件编码 24 f.write("yyy") 25 print("写入字母之后的位置:", f.tell()) 26 data2 = f.read(5) 27 print("-------%s-------" % (data2) ) 28 print("读取字母之后的位置:", f.tell()) 29 f.write("zzz") 30 print("写入字母之后的位置:", f.tell()) 31 data = f.read(5) 32 print("-------%s-------" % (data) ) 33 print("再次读入五个字母之后的位置:", f.tell()) 34 f.close() 35 写入字母之后的位置: 3 36 -------defgh------- 37 读取字母之后的位置: 8 38 写入字母之后的位置: 17 39 -------ijkzz------- 40 再次读入五个字母之后的位置: 17 41 #修改:加入seek(0,2), 42 f = open("file","r+",encoding="utf-8") #文件句柄,输出中文时注意文件编码 43 f.seek(0,2) 44 f.write("yyy") 45 print("写入字母之后的位置:", f.tell()) 46 data2 = f.read(5) 47 print("-------%s-------" % (data2) ) 48 print("读取字母之后的位置:", f.tell()) 49 f.write("zzz") 50 print("写入字母之后的位置:", f.tell()) 51 data = f.read(5) 52 print("-------%s-------" % (data) ) 53 print("再次读入五个字母之后的位置:", f.tell()) 54 f.close() 55 #结论:在文件末添加,但是读取会出现异常,需要添加seek(0) 56 57 #******************模式:w+********************* 58 f = open("file","w+",encoding="utf-8") #文件句柄,输出中文时注意文件编码 59 print("初始位置:", f.tell()) 60 f.write("abcdefghijk") 61 print("写入字母之后的位置:", f.tell()) 62 data2 = f.read(5) 63 print("-------%s-------" % (data2) ) 64 print("读取字母之后的位置:", f.tell()) 65 f.write("zzz") 66 print("写入一个字母之后的位置:", f.tell()) 67 data = f.read(5) 68 print("-------%s-------" % (data) ) 69 print("再次读入五个字母之后的位置:", f.tell()) 70 f.close() 71 初始位置: 0 72 写入字母之后的位置: 11 73 -------------- 74 读取字母之后的位置: 11 75 写入一个字母之后的位置: 14 76 -------------- 77 再次读入五个字母之后的位置: 14 78 #修正:在第一次写入后,加seek(0)情况 79 初始位置: 0 80 写入字母之后的位置: 11 81 当前位置: 0 82 -------abcde------- 83 读取字母之后的位置: 5 84 写入字母之后的位置: 14 85 -------fghij------- 86 再次读入五个字母之后的位置: 14 87 #******************模式:a+**************** 88 f = open("file","a+",encoding="utf-8") 89 print("初始位置:", f.tell()) 90 data2 = f.read(5) 91 print("-------%s-------" % (data2) ) 92 print("读取字母之后的位置:", f.tell()) 93 f.write("zzz") 94 print("写入字母之后的位置:", f.tell()) 95 data = f.read(5) 96 print("-------%s-------" % (data) ) 97 print("再次读入五个字母之后的位置:", f.tell()) 98 f.close() 99 -------------- 100 读取字母之后的位置: 11 101 写入字母之后的位置: 14 102 -------------- 103 再次读入五个字母之后的位置: 14 104 #结论:在文件后追加,读取文件有问题,没有输出 105 #修改:在第一次读取前添加seek(0) 106 -------abcde------- 107 读取字母之后的位置: 5 108 写入字母之后的位置: 17 #追加 109 -------fghij------- #从第6个位置开始读 110 再次读入五个字母之后的位置: 17 111 #结论: 添加seek(0)可以解决读取的问题,但是tell()返回位置和继续读取位置不一样
以上是关于Python修炼之路-文件操作的主要内容,如果未能解决你的问题,请参考以下文章