python的文件操作

来源:互联网 发布:神奇先生知乎 编辑:程序博客网 时间:2024/06/06 09:32

主要就两种打开文件和操作文件

一、打开文件

python中打开文件有两种方式open()和file()都可以一般使用open
打开文件 :文件句柄 = open(‘文件路径’, ‘模式’,‘编码格式’)
文件句柄又被称为文件操作符,文件操作对象还有这些命名方式:f ,file , f_obj , f_handler , fh
f=open(…)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。f=open('a.txt','r',encoding='utf-8')

只要打开文件的编码与python解释器的编码相同就不会乱码
打开文件的模式有:

  • r:只读模式(默认模式)文件内部指针指向最开始。
  • w:只写模式,一打开就清空文件。(存在则覆盖,不存在就建立一个新的)
  • a:追加模式,(可读,文件指针指向最后)
  • ‘+’:表示可以同时读取和写入一个文件
  • r+:表示可读可写,文件指针在最开始,可以刚开始就追写但会覆盖,追加需把文件指针移到最后。
  • w+:表示可写可读,如果文件存在则会覆盖清空,然后写入,写入后可以read。
  • a+:同a

b:图片、音乐、视频等任何文件(bytes打开形式)
传输,上传下载
- rb:以bytes形式打开文件来进行读取。
- wb:清空文件然后以bytes形式来写入
- ab:以bytes形式进行追加。

读取文件的操作

  1. 读取文件的第一种方式:file.read()用read方法会一次性的读取文件中的所有内容并以字符串的类型输出。
  2. 读取文件的第二种方式:file.readline()每次执行readline就会往下读第二行并以字符串的形式输出。
  3. 读取文件的第三种方式:file.readlines()返回一个列表将列表中的每一行作为列表中的每一项
  4. 读取文件的第四种方式:for i in f ,每次只读一句内存中也只存在一行的大小,f是一个可迭代的文件流类型。

read(3)在打开文本文档时读文件内的三个字符,在以二进制形式打开的文件内则是读三个字节。

写入文件的操作

file.write(str)传入一个str类型进行写入。

文件内指针的移动

seek,tell,truncate
注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的,常用seek(0)移动到开头,seek(0, 2)移动到最后面
  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果,truncate()字节 从文件开始的位置只保留指定字节的内容与文件指针无关
  3.tell告诉你当前指针的位置

对于文件的修改

流程

import osf = open('原文件',encoding='utf-8')f2 = open('原文件.bak', 'w', encoding='utf-8')line = f.read()new_line = line.replace('原来的', '新的内容')f2.write(new_line)f.close()f2.close()os.remove('原文件')os.rename('原文件.bak', '原文件')

但是这个方法很low因为这方法一次性读取了所有的文件内容,文件一大在内存中所占的资源非常大所以我们用for循环来改进。

f = open('原文件',encoding='utf-8')f2 = open('原文件.bak', 'w', encoding='utf-8')for line in f:    line = line.replace('原来的内容', '新的内容')    f2.write(line)f.close()f2.close()os.remove('原文件')os.rename('原文件.bak', '原文件')

增加一个从文件中读取信息,转变为字典类型

with open('SQL',encoding='utf-8') as f:    for i in f:  # i为字符串        if i.strip():  # 判断字符串是否为空            dic = {}            i = i.strip()  # 去除字符串两端的空格还可以去除换行符            li = i.split()            lis = []            dic['name'] = li[0]            dic['age'] = li[1]            lis.append(dic)print(lis)