DAY8 文件操作

文件操作

  what and why?为什么需要文件?

  答:通过之前的计算机基础,我们知道,数据如果想要永久保存下去,就需要存储到硬盘中。但是,应用程序是不可以直接操作硬件的,所以需要用到操作系统。操作系统把复杂的硬件操作封装成接口提供给应用程序,文件就是其中用来操作硬盘的虚拟概念。读写文件其实就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从文件中读取数据(读文件),或者把数据写入(写文件)。

  how?如何进行文件操作?

  答:前提需要三要素:

  (1)文件路径

  (2)文件的编码方式

  (3)文件的打开方式:只读,只写,追加,读写...

 

打开文件:

f = open('E:\python_training_s1\day8\\testfile.txt',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()

 

  f :本质就是一个普通的变量名,代表文件对象,文件句柄,用来文件操作。

    通常的名为有: f,f_obj,f_handler,f_h,fh...

 open():打开文件,调用的是操作系统的open命令。参数为文件的三要素。

 close():关闭文件,释放内存地址。

'''
常见错误:
(1)unicodedecodeerror:文件存储和打开的编码不一致。
(2)OSError:有\t,\n这种特殊字符,需要用raw str或者\\解决
'''

读:

 打开方式(mode):r,rb,r+,r+b

 读的五种方法:

 (1)f.read():把文件全部内容一次性读取进内存中。如果文件过大,会撑爆内存。

 (2)f.read(n): 在‘r’模式下,n代表字符;在‘rb’模式下,n代表的是字节。

 (3)f.readline(): 一次读取一行

 (4)f.readlines(): 返回一个列表,文件一行的内容就是列表的一个元素。

 (5)for line in f: 循环句柄,这种方式一次只会在内存开辟一行的空间。推荐。

#前提:从文件中读进来的内容的数据类型都是字符串str类型
#文件的内容:我在学习python
       python is elegant '''f.read():一次性把文件的内容都读进内存中。缺点:如果文件过大,会撑爆内存''' f = open('testfile.txt','r',encoding='utf-8') content = f.read() print(content) f.close() >>>'我在学习python' '''f.read(n):在r模式下,n为字符;在rb模式下,n为字节 ''' f = open('testfile.txt',encoding='utf-8',mode='r') content = f.read(3) print(content) f.close() >>>'我在学' f = open('testfile.txt','rb') content = f.read(3) print(content) f.close() >>>b'\xe6\x88\x91' #utf-8编码下,一个汉字为3个字节。 '''f.readline():一次读取一行,缺点:每次读一行需要调用一次readline(),效率低''' f = open('testfile.txt','r',encoding='utf-8') line1 = f.readline() #打印第一行 line2 = f.readline() #打印第二行 print(line1) print(line2) f.close() '''f.readlines():返回一个列表,一行就是列表的一个元素''' f = open('testfile.txt','r',encoding='utf-8') content = f.readlines() print(content) f.close() >>> ['我在学习python\n', 'python is elegant'] '''for line in f: 循环文件句柄,每次只会在内存中创建一行''' f = open('testfile.txt','r',encoding='utf-8') for i in f: print(i.strip()) f.close() >>> 我在学习python python is elegant

写:

 打开方式:w,wb,w+

 f.write(): 如果没有此文件,创建文件并写入;如果文件存在内容,先清空后写入。

#如果文件不存在,会创建文件。
f = open('test.txt','w',encoding='utf-8')
f.write('哈哈哈')
f.close()


# 如果文件存在且有内容,会清空原内容后写入
f = open('testfile.txt','w',encoding='utf-8')
f.write('哈哈哈')
f.close()

# wb : 以二进制的方式写入(bytes类型)
# f = open('testfile.txt','wb')
# f.write('呵呵呵'.encode('utf-8'))
# f.close()

追加:

  打开方式:a,ab.. 把内容追加到文件的末尾

  f.write()

f = open('testfile.txt','a',encoding='utf-8')
f.write('\npython is cool')
f.close()

读写:

  mode=‘r+’,先读后写(关键在光标的位置)

  一.先读,后追加。不管读多少个字符,光标都置于末尾,在末尾追加内容。

#文件内容
'''我在学习python
python is elegant'''

情景一:f.read()
f = open('testfile.txt',encoding='utf-8',mode='r+')
content = f.read()
print(content)
f.write('hahaha')
f.close()
>>>
我在学习python 
python is eleganthahaha            

情景二: f.read(n)
f = open('testfile.txt','r+',encoding='utf-8')
content = f.read(6)
print(content)
f.write('hahaha')
f.close()
>>>
我在学习py

  二.先写,后读。先按照写入的字节长度替换内容,接着把光标后的内容读出来。

f = open('testfile.txt','r+',encoding='utf-8')
f.write('hahaha')
content = f.read()
print(content)
f.close()
>>>
学习python
python is eleganthahaha

写读:

  打开方式:w+,先写后读

  先清空后写入,此时光标在最后的位置,再读根本毫无意义。除非结合f.seek()移动光标,再进行读取。

f = open('testfile.txt','w+',encoding='utf-8')
f.write('java is good')
content = f.read()
print(content)               #此时光标在最后面,content的内容就是行末的换行符
f.close()
>>>
'\n'  

# 先写后读,结合f.seek()移动光标
f = open('testfile.txt','w+',encoding='utf-8')
f.write('java is better')
f.seek(0)                  #f.seek(0)表示把光标移到文件的开头处
content = f.read()         #此时,content的内容就为新吸入的内容
print(content)
f.close()
>>>
java is better

追加可读:

    打开方式:a+

   与w+的效果一样,需要结合f.seek()。

 

文件操作常用方法:

(1) f.close() : 关闭文件

(2) f.read(n) : 默认把文件的所有内容都读取出来;如果有n选项,在r模式下,n代表字符;在rb模式下,n代表字节。

(3)f.readable() : 文件是否可读,返回True/False

(4)f.readline() :每次读取文件的一行内容

(5)f.seek():调整光标的位置,按照字节数调整。f.seek(0):光标跳转到文件开头处。f.seek(0,2):光标跳转到文件末尾处.

(6)f.tell(): 获取当前光标所在位置,也是按照字节;常与f.seek()一起使用。

(7)f.truncate():在写模式下,截断数据;按照字节数保留指定之前的数据。

# 文件内容: python is cool
f = open('testfile.txt','a',encoding='utf-8')
f.truncate(2)    #截取保留两个字节
f.close()

(8)f.write():  文件不存在,创建文件并写入内容;文件存在,清空原有内容后写入。

(9)f.writeable() : 文件是否可写,返回True/False

 

with上下文

  好处:1.主动关闭文件句柄   2.可以同时打开多个文件句柄,对多个文件进行操作

with open('testfile.txt',encoding='utf-8',mode='r') as f:
    content = f.read()
    print(content)



#同时打开多个文件句柄
with open('testfile.txt',encoding='utf-8',mode='r')as f1,\
open('xxx',encoding='utf',mode='w') as f2: pass

  

文件的修改方法:

1.以读模式打开原文件,生产一个文件句柄f1

2.以写模式创建一个新文件,生产一个文件句柄f2

3.读取原文件内容进行修改,并写入新文件

4.将原文件删除(os模块的os.remove())

5.将新文件重命名为原文件(os模块的os.rename())

 

posted @ 2018-08-13 16:57  hehehe1994  阅读(117)  评论(0编辑  收藏  举报