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())

 

posted @ 2017-10-19 14:59  Druid_Py  阅读(254)  评论(0编辑  收藏  举报