文件操作

一,文件操作流程

1,打开文件

f = open("歌词","w",encoding = "utf-8") #默认打开方式为读"r"。

打开文件操作f = open("歌词","w",encoding = "utf-8")分析:

1、由应用程序向操作系统发起系统调用open
2、操作系统打开该文件,并返回一个文件句柄给应用程序
3、应用程序将文件句柄赋值给变量f

2,通过文件操作符对文件进行操作

f = f.write()  #f叫文件操作符(文件句柄,文件操作对象),习惯叫f,file,fh...

3,关闭文件

f.close()

print(f.writable())      #判断文件是否可写

print(f.readable())      #判断文件是否可读

f.write("23948749")      #写文件需要写数字的时候,需要将数字转化为字符串

f.write("\nasdfg")  #\n文件的换行

*****找到文件详解*****

1,文件与py的执行文件在相同路径下,直接用文件名字就可以打开文件

文件与py的执行文件在不同路径下,用绝对路径找到找到文件

2,文件的路径,需要用取消转译的方式来表示:1:\\   2:r" "

3,如果以写文件的方式打开一个文件,那么不存在的文件将被创建,存在的文件之前的内容会被清空

*****关闭文件详解*****

关闭文件的方法:
1、f.close() #操作系统级的关闭文件
2、del f #释放一个python程序内存中的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源
一个python程序内存中的变量在内存中会自动释放,所以del f可写可不写,在操作文件完后,一定要记住f.close()
二,文件编码:
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,操作系统用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
如f=open('歌词','w',encoding='utf-8')
三,文件的打开模式
f = open("文件路径",操作模式,编码)
f = open("歌词","r",encoding = "utf-8")
读文件的几种方式:
1,read方法,用此方法会一次性的读出文件中的所有内容
content = f.read()
print(content)
2,read(n),读一部分内容,指定读n个单位
print(f.read(5))
3,按照行读,每次执行readline就会往下读一行
content = f.readline()
print(content.strip()) #strip去掉空格、制表符、换行符
content2 = f.readline()
print(content2.strip())
print(1)  #--> 1\n输出最后自动有换行符\n
print('1\n') #--> 1\n\n
4,readlines,将文件中的每一行作为列表中的每一项并返回一个列表
content = f.readlines()
print(content)
5,最常用的读方法
for l in f:
  print(l,strip())
练习1:有如下购物单:读文件并将它整理成字典类型
apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3
f = open('shoplist',encoding='utf-8')
goods_list = []
for line in f:
    if line.strip():
        goods_dic = {'name':None,'price':None}
        line = line.strip()
        goods_lst = line.split()
        goods_dic['name'] = goods_lst[0]
        goods_dic['price'] = goods_lst[1]
        goods_list.append(goods_dic)
print(goods_list)
f.close()
结果为[{'name': 'apple', 'price': '10'}, {'name': 'tesla', 'price': '100000'}, {'name': 'mac', 'price': '3000'}, {'name': 'lenovo', 'price': '30000'}, {'name': 'chicken', 'price': '10'}]

练习2:只显示文件中有内容的行

f = open('shoplist',encoding='utf-8')
goods_list = []
for line in f:
   if line.strip():
       print(line.strip())
f.close()

三,打开文件的几种模式

1.对于文本文件

 

r ,只读模式:默认模式,文件必须存在,不存在则抛出异常
w,只写模式:不可读;不存在则创建;存在则清空内容
a, 之追加写模式:不可读;不存在则创建;存在则只追加内容

 

 

2.使用b模式,"b"表示以字节的方式操作,主要用于:
图片文件,音乐,视频文件
文件传输:上传,下载
网络编程
#修改文件的编码——非常不重要,不重要程度五颗星
#utf-8 用utf8的方式打开一个文件
#读文件里的内容str
#将读出来的内容转换成gbk
#以gbk的方式打开另一个文件
#写入
rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
a+:写读[可读可写]追加可读
f = open('歌词','a+',encoding='utf-8')
f.write('\nqq星')
f.seek(0)
print(f.read())
f.close()
 
 
r+:读写[可读可写]先读后写,写是追写;先写后读,从头开始写
w+:写读[可写可读]一上来文件就清空了,尽管可读,但是读出来的内容是你这次打开文件新写入的;光标在最后,需要主动移动光标才可读。
f = open('歌词','w+',encoding='utf-8')
f.write('abc\n')
f.write('及哈哈哈')
f.seek(0)
print(f.read())
f.close()
 
 
一般情况下:文件操作,要么读,要么写,很少会用到读写、写读同时用的
#常用的操作方式:
r、w、a
rb、wb、ab
文件内的光标移动

一: read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek,光标移动到第几个字节的位置,有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  f.seek(0)移动到最开始

  f.seek(0,2)移动到最末尾

  2. truncate是从文件开始位置只保留指定字节的内容,文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

  f.truncate(3)
   3.tell告诉我光标在第几个字节
   print(f.tell())
四,文件的修改
1,创建一个新文件
f2 = open("原文件.bak","w",encoding = "utf-8")
2,把原来文件中的内容读出来
f = open("原文件",encoding = "utf-8")
old_content = f.read() #"原来的内容\n"
3,操作读出来的字符串,把字符串中的内容替换掉
new_content = old_content.raplace("新","原来")
4,把替换之后的内容写到新文件里
f2.write(new_content)
f.close()
f2.close()
5,删除原文件,新文件重命名成原文件的名字
import os #os模块
os.remove("原文件")  #删除文件
os.rename("原文件.bak","原文件")  #重命名  #replace("老内容","新内容")
###文件的删除
import os
os.remove("原文件")
文件的修改常用的方法是用for循环
f2 = open("原文件.bak","w",encoding = "utf-8")
f= =open("原文件",encoding = "utf-8")
for line in f:
  new_line = line.replace("原来","")
  f2.write(new_line)
f.close()
f2.close()
import os
os.remove("原文件")
os.rename("原文件.bak","原文件")
 
 
进阶例子:只替换第一个
f2 = open('原文件.bak','w',encoding='utf-8')
f = open('原文件',encoding='utf-8')
count = 0
for line in f:
    if '原来' in line and count == 0:
        new_line = line.replace('原来','')
        f2.write(new_line)
        count = 1
    else:
        f2.write(line)
f.close()
f2.close()
import os
os.remove('原文件')
os.rename('原文件.bak','原文件')
##with操作文件,针对很多时候回忘记写f.close()关闭文件
常规写法:
f = open("原文件",encoding = "utf-8")
content = f.read()
print(content)
f.close()
 
 
with操作写法:
with open("原文件",encoding = "utf-8") as f:
  content = f.read()
  print(content)
  for line in f:
    print(line.strip())
多个文件with操作:
with open('原文件',encoding='utf-8') as f,open('原文件.bak','w',encoding='utf-8') as f1:
    for line in f:
        new_line = line.replace('原来','')
        f1.write(new_line)
import os
os.remove('原文件')
os.rename('原文件.bak','原文件')

 

 







 
 
 
 
 
 
 


 

 


 
 
 


 

 

转载于:https://www.cnblogs.com/weiwu1578/articles/7755408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值