08-Python-文件操作
1、文件基本操作
1 file = open('pi_digits.txt','w',encoding='utf-8') #对文件进行任何操作前都要先用open()函数打开文件 2 file.write('''3.1415926535 3 8979323846 4 2643383279 5 ''') #写操作 6 7 file = open('pi_digits.txt','r') #打开文件 8 first_line = file.readline() #读一行。 9 print('first line:',first_line) #打印结果包括一个空行。first_line.rstrip()可去掉多余空行。 10 11 data = file.read() #读取剩下的所有内容,文件大时不要用。read()到达文件末尾时返回一个空字符串。 12 print(data) #打印结果包括一个空行。data.rstrip()可去掉末尾空行。 13 14 file.close() #关闭文件
2、打开文件的模式
打开文件的模式有:
-
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则覆盖】
- a,追加模式。【可读;不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
-
- r+,可读写文件。【可读;可写;可追加】。在3.0中,该方式只能将写入的内容放在原有文件内容(如果有)之后。
- w+,写读。
- a+,追加写读。
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用,在Windows上换行是\r\n,linux换行是\n,双方要互操作可以使用该模式避免此问题)
-
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
-
- rb
- wb
- ab
1 f = open("test2.txt","r",encoding="utf-8") 2 3 print(f.tell()) #显示当前指针位置 4 print(f.read(6)) #按照字符读取 5 print(f.tell()) #tell按照字节计算,一个中文字符占三个字节 6 7 print("-----------我是分隔符-----------") 8 f.seek(16) #指针指向16,seek按照字节计算 9 print(f.read()) 10 11 print("-----------我是分隔符-----------") 12 print(f.encoding) #打印字符编码 13 14 print("-----------我是分隔符-----------") 15 print(f.fileno()) #返回句柄在内存中的编号 16 17 print("-----------我是分隔符-----------") 18 print(f.flush()) #强制刷新,直接将数据写入硬盘 19 f.close() 20 21 print("-----------我是分隔符-----------") 22 f1 = open("yesterday2","a",encoding="utf-8") 23 f1.seek(2) #这里移动指针不起作用 24 f1.truncate(8) #从零开始截断至8(8后面的字符都被删除,seek()方法不起作用) 25 f1.close() 26 27 print("-----------我是分隔符-----------") 28 f1 = open("yesterday2","r+",encoding="utf-8") 29 print(f1.readline()) 30 print(f1.readline()) 31 print(f1.readline()) 32 f1.write("\n我是分割线") #只能在最末尾追加 33 f1.close() 34 35 f2 = open("test3.txt","w+",encoding="utf-8") 36 f2.write("----------华丽的分割线----------\n") 37 f2.write("----------华丽的分割线----------\n") 38 f2.write("----------华丽的分割线----------\n") 39 f2.write("----------华丽的分割线----------\n") 40 f2.write("----------华丽的分割线----------\n") 41 42 f2.seek(10) #移动指针 43 print(f2.readline()) 44 print(f2.tell()) 45 f2.write("----------应该出现在第二行----------\n") #仍然只出现在最末尾 46 f2.close() 47 48 print("-----------我是分隔符-----------") 49 f3 = open("binary","bw") 50 f3.write("这是二进制----".encode("utf-8")) #不加字符编码格式,默认使用IDE使用的字符编码格式。 51 f3.write("this is binary".encode("utf-8")) 52 f3.close() 53 54 f4 = open("binary","rb") 55 print(f4.readline()) #汉字为binary,英文字母正常 56 f4.seek(0) #指针指向首部 57 print(f4.readline().decode()) #要解码才能得到汉字 58 f4.close()
3、文件路径
当将类似pi_digits.txt这样的文件名传递给函数open()时候,Python将在当前执行的文件(即.py文件)所在的目录中查找文件。如果文件不再当前执行文件的目录中,则需要提供文件路径。
1 file = open('文件路径\文件') #在Windows系统中使用反斜杠'\'。 2 file = open('文件路径/文件') #在Linux UNIX等系统中使用斜杠'/'。 3 ''' 4 文件路径又分为相对文件路径和绝对文件路径: 5 相对文件路径:例如要执行的.py文件在Python_Work这个目录,但要打开的文件file.txt在Python_Work目录下的txt_files目录里,这个时候就可以使用相对文件路径。即: 6 file = open('txt_files\file.txt') 7 Python就会自动的去Python_Work\txt_file目录下找file.txt这个文件。 8 9 绝对文件路径:例如要执行的.py文件在Python_Work这个目录,但要打开的文件file.txt却在other_files目录下的txt_files目录里。这个时候就要使用绝对文件路径。即: 10 file = open('C:\Users\other_files\txt_files\file.txt')。 11 '''
4、flush操作
对于文件的写入来说,有一种缓存机制,意思就是在执行完write后数据并没有立马写入硬盘,而是在buffer中,只有在buffer满了后,才会写入硬盘。为了避免这种情况,可以用flush()方法强制数据立刻写入硬盘。
#执行write后,数据并没有出现在硬盘上。
#执行flush后,数据成功写入硬盘。
1 import sys,time 2 3 for i in range(20): 4 sys.stdout.write("#") #要等buffer满了之后一起打印 5 time.sleep(0.1) 6 print("\n") 7 8 for i in range(20): 9 sys.stdout.write("#") 10 sys.stdout.flush() #实时刷新输出至屏幕(进度条效果) 11 time.sleep(0.2)
5、with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
1 with open('filename','r') as file_object: 2 3 contents = file_object.read() 4 print(contexts)
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
1 with open('filename1','r') as file_object1,open('filename2','r') as file_object2: 2 3 contents1 = file_object1.read() 4 print(contexts1) 5 6 contents2 = file_object2.read() 7 print(contexts2)
当with代码块执行完毕时,内部会自动关闭并释放文件资源。使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外使用访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。
6、逐行读取
1 #使用for循环 2 file = open('pi_digits.txt','w',encoding='utf-8') #对文件进行任何操作前都要先用open()函数打开文件 3 file.write('''3.1415926535 4 8979323846 5 2643383279 6 ''') #写操作 7 8 #使用open()、close() 9 file = open('pi_digits.txt','r') #打开文件 10 for line in file: 11 print(line) #每一行后都有空行 12 print(line.rstrip()) #没有空行 13 14 file.close() 15 16 #使用with() 17 with open('pi_digits.txt','r') as files: 18 for line in files: 19 print(line.rstrip()) 20 21 22 23 #使用readlines()方法 24 filename = 'pi_digits.txt' 25 26 #使用open()、close() 27 f = open(filename) 28 lines = f.readlines() #print(type(lines))得到lines的类型为列表。 29 30 for line in lines: 31 print(line.rstrip()) 32 33 f.close() #关闭文件 34 35 36 #使用with 37 with open(filename) as file_object: 38 lines = file_object.readlines() #lines的类型为列表。即readlines得到的结果为列表。 39 40 for line in lines: 41 print(line.rstrip())