Python3 文件的各种操作

目录

 

一、文件的基本模式

读(r)

写(w)

追加(a)

读写(r+)

处理非文本(rb,wb,ab)

复制粘贴操作

二、文件方法

open()方法

with open()方法

四、文件常用的函数

file.write(str)——将字符串写入文件

file.read([size])——从文件读取指定的字节数,如果未给定或为负则读取所有内容

file.reandline()——一行一行的读取

file.close()——关闭文件

file.seek(偏移量,位置)——设置光标的位置

file.tell()——返回光标的位置

file.truncate([sieze])——截断文件

 file.flush()——刷新文件内部缓冲

  五、修改文件(*)

文件的修改步骤:

文件修改练习题


一、文件的基本模式

注:所有操作的文件都在项目中创建

读(r)

f=open("文件.txt",mode="r",encoding="UTF-8")
#s=f.read()  #读文件里所有的内容
s=f.readline().strip() #一次读一行  行与行之间有两空行,用strip()去掉一行
print(s)
s=f.readline() #一次读一行
print(s)
f.close()  #读取后关闭

文件是一个可迭代对象,可用for循环读取:

f=open("文件.txt",mode="r",encoding="UTF-8")
for line in f: #文件是一个可迭代对象
    print(line)   #一行一行的处理数据(必须会写)
f.close()

用相对路径读取文件:

f=open("../day16/a.txt",mode="r",encoding="UTF-8")
s=f.read()  #读文件里所有的内容
#print(s)
f.close()  #读取后关闭

写(w)

注意:

  • 在写操作时,都要手动控制换行,加换行符(\n),带w的第一次写时会清空文件原来的内容
  • 如果文件不存在,会自动创建文件
f=open("nnnn",mode="w",encoding="utf-8")
#f.write("我\n")
#f.write("ai \n")
f.write("ni")   #第一次写时会清除文件原来的内容
f.flush()
f.close()

追加(a)

a模式 :追加 append 不会清除之前文件里面的内容,追加在原来内容的后面

f=open("nnnn",mode="a",encoding="utf-8")
f.write("伊人")
f.write("在水一方")
f.flush()
f.close()

读写(r+)

注意:r+ 读写模式:先读后写,不论读取多少内容,光标在哪个位置,写入的时候都是在结尾写入,除非一开始就写入,这时在开头写入

f=open("nnnn",mode="r+",encoding="utf-8")
#(1)先读后写
s=f.read()
f.write("坚持")
f.write("就是胜利")
f.close()

处理非文本(rb,wb,ab)

处理图片、音频、视频等,如果mode有b,不能写encoding

复制粘贴操作

从D:/gr.jpg读取图片写入E:/gr.jpg

f=open("D:/gr.jpg",mode="rb")#这里不能写encoding
e=open("E:/gr.jpg",mode="wb")
for line in f:     #从D:/gr.jpg读取图片
    e.write(line)  #写入E:/gr.jpg
f.close()
e.flush()#刷新文件的内部缓冲
e.close()

二、文件方法

open()方法

语法:

open(文件名(路径),mode="?",encoding="UTF-8")

打开文件后需要关闭

文件路径:

1.绝对路径:从磁盘根目录开始;或者从互联网上拷贝一个路径

2.相对路径(用得比较多):相对于当前 ./当前 ../上一级目录

with open()方法

不需要关闭

四、文件常用的函数

  1. file.write(str)——将字符串写入文件

  2. file.read([size])——从文件读取指定的字节数,如果未给定或为负则读取所有内容

  3. file.reandline()——一行一行的读取

  4. file.close()——关闭文件

  5. file.seek(偏移量,位置)——设置光标的位置

  6. file.tell()——返回光标的位置

  7. file.truncate([sieze])——截断文件

  8.  file.flush()——刷新文件内部缓冲

注意:

  • file.truncate([sieze])——截断文件。从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
  • file.seek(偏移量,位置)——设置光标的位置

           seek(0) 光标移动到开头

           seek(0,2)光标移动到末尾,在末尾的偏移量是0

事例:

反复读取文件 就要用seek

f=open("nnnn",mode="r",encoding="utf-8")
for line in f:
    print(line.strip())  #读完后光标在末尾,再次for循环不会读

f.seek(0) #移动光标到开头

for line in f:
    print(line.strip())#不会读,将光标移到开头就可以读
f.close()

file.read([size])中size表示字节,3byte =>一个中文

f=open("nnnn",mode="r",encoding="utf-8")
f.seek(3) #3byte =>一个中文
s=f.read(1)#读取一个字符
print(s)
f.close()
tell 获取光标位置
f=open("nnnn",mode="w",encoding="utf-8")
f.write("娃哈哈啊娃哈哈")
f.seek(9)  #3byte =>一个中文
print(f.tell())

f.truncate(12) #如果给参数,从文件开头截断到参数位置 ;如果没参数,删掉光标后的所有内容
f.flush()
f.close()

  五、修改文件(*)

文件的修改步骤:

  1. 引入os模块      os.remove(文件) ——删除文件          os.rename(文件)——重命名文件
  2. 打开目标文件 r
  3. 打开文件副本 w
  4. 从r中读取内容进行修改,写入到副本
  5. 删除源文件
  6. 重命名副本

文件修改练习题

(1)将文件“修改文件.txt”的a改为A.

分析:先读文件,然后用replace()完成替换,将修改后的存放在副本,再将之前的文件删掉,再重命名副本文件名

import os  #引入os模块
with open("修改文件.txt",mode="r",encoding="utf-8")as f,\
    open("修改文件.txt_副本",mode="w",encoding="utf-8")as f1:
#将f修改后的存在副本f1
    for line in f:
        line=line.replace("a","A") #将a替换成A
        f1.write(line)

#删除文件
os.remove("修改文件.txt")
os.rename("修改文件.txt_副本","修改文件.txt")
A 是第一个
A 是小写字母
A是英文字母

(2)将日志文件2019-05-17的内容转换成规定样式

1,abc,1001,特斯拉
2,bcd,1002,五菱宏光
3,def,1003,摩拜
4,ghj,1004,小黄车
[{id:1,name:abc,phone:1001,car:特斯拉}]
lst=[]
with open("2019-05-17", mode="r", encoding="utf-8") as f:
      for line in f:
        dic = {}  # 每行一个字典
        # 1,abc,1001,特斯拉
        ls= line.strip().split(",")  # 逗号切割
        dic['id'] = ls[0]
        dic['name'] = ls[1]
        dic['phone'] = ls[2]
        dic['car'] = ls[3]
        #print(dic)  # strip()去掉空白
        lst.append(dic)

print(lst)

结果:

[{'id': '1', 'phone': '1001', 'name': 'abc', 'car': '特斯拉'}, {'id': '2', 'phone': '1002', 'name': 'bcd', 'car': '五菱宏光'}, {'id': '3', 'phone': '1003', 'name': 'def', 'car': '摩拜'}, {'id': '4', 'phone': '1004', 'name': 'ghj', 'car': '小黄车'}]

方法二:

lst=[]
lst1=['id', 'name', 'phone', 'car']
with open("2019-05-17", mode="r", encoding="utf-8") as f:
      for line in f:
        dic = {}  # 每行一个字典
        # 1,abc,1001,特斯拉
        ls= line.strip().split(",")  # 逗号切割
        for i in range(len(ls)):
            dic[lst1[i]]=ls[i]
            lst.append(dic)

print(lst)

举一反三:当行列不断增加,又该怎么做?

例:

id,name,phone,car,home,salary
1,abc,1001,特斯拉,四川,100000
2,bcd,1002,五菱宏光,重庆,20000
3,def,1003,摩拜,广州,30000
4,ghj,1004,小黄车,深圳,40000
lst=[]
with open("2019-05-18", mode="r", encoding="utf-8") as f:
    first=f.readline().strip().split(",")  #读取第一行
    #print(first)  #['id', 'name', 'phone', 'car', 'home', 'salary']
    for line in f:
        dic = {}  # 每行一个字典
        # 1,abc,1001,特斯拉
        ls = line.strip().split(",")  # 逗号切割
        for i in range(len(first)):
            dic[first[i]] = ls[i] #规律:每行的切片后索引相同
            lst.append(dic)

print(lst)

结果:

[{'car': '特斯拉', 'phone': '1001', 'id': '1', 'name': 'abc', 'home': '四川', 'salary': '100000'}, {'car': '五菱宏光', 'phone': '1002', 'id': '2', 'name': 'bcd', 'home': '重庆', 'salary': '20000'}, {'car': '摩拜', 'phone': '1003', 'id': '3', 'name': 'def', 'home': '广州', 'salary': '30000'}, {'car': '小黄车', 'phone': '1004', 'id': '4', 'name': 'ghj', 'home': '深圳', 'salary': '40000'}]

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值