python | 文件的操作

文件操作

文件打开

文件打开

方式一:必须手动关闭文件句柄,路径尽量使用绝对路径。

f =open('文件路径',encoding='解码方式',mode='打开模式')
pass

f.close

 

方式二(推荐):不用手动关闭,使用完后自动关闭。

with open('文件路径',encoding='解码方式',mode='打开模式')as f:
   pass

用方式二打开多个文件句柄,用,\分开。

with open('文件路径',encoding='解码方式',mode='打开模式')as f1,\
open('文件路径',encoding='解码方式',mode='打开模式')as f2:
   pass

 

路径

os模块:系统操作系统模块

sys模块:解释器操作模块

将文件路径导入默认路径sys.path后,打开当前文件时路径可以直接使用文件名打开。

默认路径一般包括当前项目路径,当前脚本父路径,python解释器安装路径下的一部分路径。

__file__:文件绝对路径

os.path.dirname(__file__) :父路径

os.path.dirname()可以继续套娃

import os
import sys

sys.path.append(os.path.dirname(__file__)+'/bb')  

创建可变的绝对路径。

import os

path=os.path.dirname(__file__)

 

操作模式

1、读:r,rb(binary),r+,r+b。

默认r按照编码方式读文件;rb读比特流,一般用作读取非文本文件;r+读和追加,在读取的光标后面追加;r+b读和追加比特流。无法自动创建文件。

2、写:w,wb,w+,w+b。

打开文件,清空后写入,无指定文件时可以自动创建。

3、追加:a,ab,a+a+b

打开文件,从文件最后追加写入,无指定文件时可以自动创建。

4、文本:t(text)

默认按照文本文件方式读出。

 

文件读的方式

(1)一次性全部读取

with open('文件路径',encoding='utf-8')as f:
   content=f.read()
   print(content)

 

(2)按照指定字符读取

with open('文件路径',encoding='utf-8')as f:
   content=f.read(4)
   print(content)

 

(3)只读取一行,读完换行

with open('文件路径',encoding='utf-8')as f:
   content=f.readline()
   print(content)

 

(4)逐行读取,返回一个列表

with open('文件路径',encoding='utf-8')as f:
   content=f.readlines()
   print(content)

 

(5)for循环迭代读取,内存中读取一行,打印一行,节省内存,适合读取大文件(推荐)

with open('文件路径',encoding='utf-8')as f:
   for line in f:
  print(line)

 

文件写入和追加的方式

写和追加相似,区别在于重新创建文件句柄后,是否会清空文件。

文件的写入

with open('文件路径',encoding='utf-8',mode='w')as f:
   f.write('写入内容')

文件的追加

with open('文件路径',encoding='utf-8',mode='a')as f:
   f.write('追加内容')

 

文件的改操作

1、以读的模式打开原文件

2、以写的模式创建新文件

3、将原文件读出的内容修改,写入新文件

4、将原文件删除

5、将新文件重命名成原文件

import os

with open('6文件的改操作', encoding='utf-8')as f1,\
   open('6文件的改操作.bak',encoding='utf-8',mode='w')as f2:
   for line in f1:
       new_line=line.replace('ab','AB')
       f2.write(new_line)
       
os.remove('文件的改操作')
os.rename('文件的改操作.bak', '文件的改操作')

 

其他操作

tell 获取光标字节位置

with open('文件的其他功能', encoding='utf-8')as f:
   f.read()
   print(f.tell())

 

seek 调整光标字节位置

with open('文件的其他功能', encoding='utf-8')as f:
   f.seek(3)                                   #f2.seek(0,2)光标移动到最后
   content=f.read()
   print(content)

 

flush 强制刷新(保存)

with open('文件的其他功能', encoding='utf-8', mode='w')as f:
   f.write('文件的其他功能:tell seek flush')
   f.flush()

 

json模块

可将数据类型转为字符串,set 除外,tuple 使用 json 转为字符串,再转回来会变为 list 数据类型。兼容性好。

直接序列化写入文件

使用dump直接写入文件时,只能写入一次,否则load读取出来会出错,原因是文件中间存在多余的""。

import json

with open('a.txt',mode='w',encoding='utf-8') as f:
   json.dump([1,2,3],f)
   
with open('a.txt',encoding='utf-8') as f:
   print(json.load(f))

先在内存中序列化,再写入文件

想要可以多次写入w,可以再内存中dumps,再写入文件,也可以多次loads。

import json

with open('b.txt',mode='a',encoding='utf-8') as f:
   f.write(json.dumps([2,3,3])+'\n')            
   f.write(json.dumps([2,3,3])+'\n')
   
with open('b.txt',encoding='utf-8') as f:
   print(json.loads(f.readline().strip()))
   print(json.loads(f.readline().strip()))

上述读取需要知道文件行数,大于文件行数会报错,可使用异常处理try解决。

import json

with open('b.txt',encoding='utf-8') as f:
while True:
  try:
      print(json.loads(f2.readline().strip()))
  except json.decoder.JSONDecodeError:
      break

 

pickle模块

可将数据转为字节串,可多次写入读取,使用b二进制的写入读取模式。

import pickle

with open('c.txt',mode='wb')as f:
   pickle.dump((1,2,3),f)
   pickle.dump((1,2,),f)

with open('c.txt',mode='rb')as f:
   print(pickle.load(f))
   print(pickle.load(f))

 

posted @ 2020-07-20 11:22  ジョカ  阅读(74)  评论(0)    收藏  举报