博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python--中的文件操作
阅读量:5251 次
发布时间:2019-06-14

本文共 3276 字,大约阅读时间需要 10 分钟。

1.文件操作 

  把文件打开

open 打开f = open ('文件路径',mode='模式',encoding='编码格式')#打开一个文件操作的时候取到的是一个句柄

  读取的方法

. read()      将文件中的内容全部读取出来. 弊端: 占内存.如果文件过大,容易导致内存崩溃 . read(n)     默认:读去文件内容全部read(n) 读取n个字符. readline()  一次读取一行数据 , 注意每次读出来的数据都会有一个\n 需要使用strip()去空格. readlines() 读取全部. 返回列表,也容易出现内存崩溃的问题,不建议使用  for line in f:   每次读取一行内容    print(line.strip())

 

  1.  只读( r , rb)    读取文件的相关操作

     rb. 读取出来的数据是bytes类型, 在rb模式下, 不能选择encoding字符集

     rb的作用: 在读取非文本文件时,比如读取MP3.图像. 视频等信息的时候就需要用rb. 因为这种数据没办法直接显示出来

 

  2.  只写(w , wb)  

     w 写入,只写,如果没有文件会创建文件,文件存在会清空文件,再写入新的内容

     wb 模式下,可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据

  3.  追加(a ,ab)

     追加模式下,写入的内容会追加在文件的末尾. 追加写读所有带b的操作就是对bytes进行操作, 主要用于非文本文件的时候比如音频 图片 视频rbwb就适用这个

   可用于断点续传.

     a模式也可以创建文件

  4.  读写 (r+ , r+b)

     读写模式必须是先读,因为默认光标是在开头的

     r+ 模式下必须先读取再写入

  5.  写读 (w+ , w+b)

     先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

  6.  写读(追加 写读)a+ 

     a+模式下,不论是先读还是后读,都是读取不到数据的,因为追加之后光标在末尾,如果需要读取数据要移动光标seek

 

二.文件操作中关于文件句柄的相关操作

1. seek() 移动光标

seek:两个参数1. 表示偏移量2. 从xxx开始偏移, 默认0, 开头 1, 当前位置 2, 末尾

    f.seek(0) 移动到开头

  f.seek(0, 2) 移动到末尾, seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表示开头, 1表示当前位置 2表示结尾

 

2. tell()返回光标所在的位置

print(f.tell())

3. truncate() 截断文件

f = open("文件1", mode="w", encoding="utf-8")f.write("哈哈") # 写入两个字符f.seek(3) # 光标移动到3, 也就是两个字中间f.truncate() # 删掉光标后面的所有内容f.close()f = open("文件1", mode="r+", encoding="utf-8")content = f.read(3) # 读取12个字符f.seek(4)print(f.tell())f.truncate() # 后面的所有内容全部删掉# print(content)f.flush()f.close()

 

三.文件修改 

文件修改的步骤

  1.先从文件中读取数据

  2.把要修改的内容修改

  3.写入新文件

  4.删除旧文件

  5.给新文件改名

# 导入os模块  os表示操作系统import os# f = open("夸一夸123", mode="r", encoding="utf-8")# f2 = open("夸一夸123_副本", mode="w", encoding="utf-8")# with会自动的帮我们关闭文件的链接with open("夸一夸123", mode="r", encoding="utf-8") as f, \     open("夸一夸123_副本", mode="w", encoding="utf-8") as f2:    for line in f:        if "好人" in line:            line = line.replace("好人", "sb")        f2.write(line)# time.sleep(3) # 程序暂停3秒  这里让程序暂停就是为了直观的显示功能,计算机处理速度过快 看不出来# 删除原来文件os.remove("夸一夸123")# 重命名副本为原来的文件名os.rename("夸一夸123副本", "夸一夸123")

 

一个重要的练习:

名字  数量 价格  数量香蕉   1     85     50苹果         2    60        30编号,名称,价格1,香蕉,1,852,苹果,2,6要想获得这些数据f = open("水果.txt", mode="r", encoding="utf-8")lst = []for line in f:  # 1,香蕉,1.85,50    dic = {}  # 每行都是一个字典    line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50    a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]    dic['id'] = a    dic['name'] = b    dic['price'] = c    dic['totle'] = d    lst.append(dic)print(lst)# f = open("水果.txt", mode="r", encoding="utf-8")# line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈# h,i,j,k = line.split(",")# lst = []# for line in f:  # 1,香蕉,1.85,50#     dic = {}  # 每行都是一个字典#     line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50#     a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]#     dic[h] = a#     dic[i] = b#     dic[j] = c#     dic[k] = d#     lst.append(dic)## print(lst)f = open("水果.txt", mode="r", encoding="utf-8")line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈title = line.split(",") # [编号,名称,价格,数量,哈哈]lst = []i = 0for line in f:  # 1,香蕉,1.85,50    dic = {}  # 每行都是一个字典    line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50    data = line.split(",") # [1, 香蕉, 1.85, 50]    for i in range(len(title)):        dic[title[i]] = data[i]    lst.append(dic)print(lst)

 

转载于:https://www.cnblogs.com/robertx/p/10073026.html

你可能感兴趣的文章
【识记】 域名备案
查看>>
STL uva 11991
查看>>
MY SQL的下载和安装
查看>>
自定义OffMeshLink跳跃曲线
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
学习Redux之分析Redux核心代码分析
查看>>
ABAP 创建和调用WebService
查看>>
C# 实例化顺序
查看>>
CSS水平垂直居中总结
查看>>
委托又给我惹麻烦了————记委托链的取消注册、获取返回值
查看>>
ps怎么把白色背景变透明
查看>>
gource 安装教程
查看>>
字符串转 Boolean 的正确方式
查看>>
给你的网站404页面加上“宝贝寻亲”公益页面
查看>>
整理推荐的CSS属性书写顺序
查看>>
协程, IO阻塞模型 和 IO非阻塞模型
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>