六、文件操作

文章目录

      • 1.文件的打开与关闭
        • 1)打开文件
        • 2)关闭文件
        • 3)写数据
        • 4)读数据(read)
        • 5)读数据(readlines)
        • 6)读数据(readline)
        • 7)获取当前读写的位置
        • 8)定位到某个位置
        • 9)案例:制作文件的备份
        • 10)绝对路径和相对路径
        • 11)编码和解码
      • 2.文件的相关操作
        • 1) 文件重命名
        • 2) 删除文件
        • 3)创建文件夹
        • 4)获取当前目录
        • 5)改变默认目录
        • 6) 获取目录列表
        • 7) 删除文件夹
        • 8)批量修改文件名

1.文件的打开与关闭

1)打开文件

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

语法如下:

open(name, mode)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读、写入、追加等。

示例如下:

    f = open('test.txt', 'w')

说明:

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

模式功能简略

功能rr+ww+aa+
++++
+++++
创建++++
覆盖++
指针在开始++++
指针在结尾++
2)关闭文件

close( )

示例如下:

    # 新建一个文件,文件名为:test.txt
    f = open('test.txt', 'w')

    # 关闭这个文件
    f.close()
3)写数据

使用write()可以完成向文件写入数据

demo: 新建一个文件 file_write_test.py,向其中写入如下代码:

f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()
4)读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据

例子:

f = open('test.txt', 'r')
content = f.read(5)  # 最多读取5个数据
print(content)

print("-"*30)  # 分割线,用来测试

content = f.read()  # 从上次读取的位置继续读取剩下的所有的数据
print(content)

f.close()  # 关闭文件,这个可以是个好习惯哦
5)读数据(readlines)

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

#coding=utf-8

f = open('test.txt', 'r')
content = f.readlines()
print(type(content))

i=1
for temp in content:
    print("%d:%s" % (i, temp))
    i += 1

f.close()
6)读数据(readline)

readline()一次读取一行内容。

#coding=utf-8

f = open('test.txt', 'r')

content = f.readline()
print("1:%s" % content)

content = f.readline()
print("2:%s" % content)


f.close()
7)获取当前读写的位置

在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取

# 打开一个已经存在的文件
f = open("test.txt", "r")
str = f.read(3)
print("读取的数据是 :%s " % str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : %s" % position)

str = f.read(3)
print("读取的数据是 : %s" % str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : %s" % position)

f.close()
8)定位到某个位置

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()

seek(offset, from)有2个参数

  • offset:偏移量
  • from:方向
    • 0:表示文件开头
    • 1:表示当前位置
    • 2:表示文件末尾

demo:把位置设置为:从文件开头,偏移5个字节

# 打开一个已经存在的文件
f = open("test.txt", "r")
str = f.read(30)
print("读取的数据是 : %s" % str)

# 查找当前位置
position = f.tell()
print("当前文件位置 : %s" % position)

# 重新设置位置
f.seek(5,0)

# 查找当前位置
position = f.tell()
print("当前文件位置 : %s" % position)

f.close()

demo:把位置设置为:离文件末尾,3字节处

# 打开一个已经存在的文件
f = open("test.txt", "r")

# 查找当前位置
position = f.tell()
print("当前文件位置 : " % position)

# 重新设置位置
f.seek(-3,2)

# 读取到的数据为:文件最后3个字节数据
str = f.read()
print("读取的数据是 : " % str)

f.close()
9)案例:制作文件的备份
# 提示输入文件
oldFileName = input("请输入要拷贝的文件名字:")

# 以读的方式打开文件
oldFile = open(oldFileName,'rb')

# 提取文件的后缀
fileFlagNum = oldFileName.rfind('.')
if fileFlagNum > 0:
    fileFlag = oldFileName[fileFlagNum:]

# 组织新的文件名字
newFileName = oldFileName[:fileFlagNum] + '[复件]' + fileFlag

# 创建新文件
newFile = open(newFileName, 'wb')

# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
    newFile.write(lineContent)

# 关闭文件
oldFile.close()
newFile.close()
'''需求:
输入一个文件名,统计文件中代码行数、注释行数、空行数
并输出代码以及注释
'''
# 1.输入文件名
fileName = input('请输入文件名')
# 打开文件
f = open(fileName,encoding='utf-8')
# 获取编码
print(f.encoding)
# 2.定义三个变量 代码行数  注释行数  空行数
codeCount = 0
commandCount = 0
blankCount = 0
# 3.读取一行
# 判断
while True:
    line = f.readline()
    if not line:
        break
    # 判断是空白 代码 注释
    # 4.注释  去空白 startswith #
    # 5.空行  有内容  去空白之后 没有内容   not content2.strip()
    newLine = line.strip()
    if not newLine:
        blankCount += 1
    elif newLine.startswith('#'):
        commandCount += 1
    else:
        codeCount += 1

print('blankCount:%d' % blankCount)
print('commandCount:%d' % commandCount)
print('codeCount:%d' % codeCount)
10)绝对路径和相对路径

绝对路径指的是在电脑硬盘上真正保存的路径 绝对路径在不同的操作系统上写法是不一样的

D:\codespace\python4\FristPython\a.txt

相对路径就是相对于当前目录的路径 相对路径用.代表当前目录,使用**…代表上一级目录 如果是当前路径可以省略./**

例如,当前文件夹下的a.txt:

./a.txt
# 简写
a.txt
11)编码和解码

打开文件并写入中文:

f = open('test.txt','w+')
f.write('你好')
f.close()

打开文件显示如下:

为什么出现乱码?

计算机只能读取和识别二进制的数据,任何数据无论是中文还是英文进行存储的时候都需要转换成二进制的数据进行存储

二进制数据和字符之间存在对应关系,也就是编码表,常用的编码表有GBK和UTF-8

把文字转换成二进制就称为编码,把读取的二进制文件转换为对应的字符就称为解码

为了保证字符正确存储和显示,就需要在编码和解码时使用同一个编码集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以出现乱码的原因是编码和解码使用了不同的编码集

windows下打开文件的编码方式是gbk,默认打开test.txt文件的方式是utf-8

f = open('test.txt','w+')
print(f.encoding)# cp936  就是gbk

解决乱码方式:

  1. 可以设置打开文件的编码方式为utf-8

    f = open('test.txt','w+',encoding='utf-8')
    f.write('你好')
    f.close()
    
  2. 修改打开test.txt的方式为gbk

2.文件的相关操作

1) 文件重命名

os模块中的rename()可以完成对文件的重命名操作

rename(需要修改的文件名, 新的文件名)

import os
os.rename("毕业论文.txt", "毕业论文-最终版.txt")
2) 删除文件

os模块中的remove()可以完成对文件的删除操作

remove(待删除的文件名)

import os
os.remove("毕业论文.txt")
3)创建文件夹
import os
os.mkdir("张三")
4)获取当前目录
import os
os.getcwd()
5)改变默认目录
import os
os.chdir("../")
6) 获取目录列表
import os
os.listdir("./")
7) 删除文件夹
import os
os.rmdir("张三")
8)批量修改文件名

需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。

步骤:

  • 设置添加删除字符串的的标识
  • 获取指定目录的所有文件
  • 将原有文件名添加/删除指定字符串,构造新名字
  • os.rename()重命名
#coding=utf-8
# 批量在文件名前加前缀
import os

funFlag = 1 # 1表示添加标志  2表示删除标志
folderName = './renameDir/'

# 获取指定路径的所有文件名字
dirList = os.listdir(folderName)

# 遍历输出所有文件名字
for name in dirList:
    print name

    if funFlag == 1:
        newName = '[Python]-' + name
    elif funFlag == 2:
        num = len('[Python]-')
        newName = name[num:]
    print newName

    os.rename(folderName+name, folderName+newName)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/278073.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子学会C/C++编程等级考试2022年09月(八级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她…

芋道视频199 - 工作流 - 关系图 - ruoyi-vue-pro

一 新建表单 数据库:bpm_form。实体类:BpmFormDO.java: 二 流程模型、流程部署、流程定义 1 第1步:创建流程模型 页面操作:实体类:Model.java。数据库:ACT_RE_MODEL 流程模板信息表&#xf…

【mysql】—— 表的内连和外连

在MySQL中,内连(INNER JOIN)和外连(OUTER JOIN)是用于联接多个表的操作。接下来,我分别给大家介绍下二者。 目录 (一)内连接 1、什么叫内连接 2、语法格式 3、案例:显…

Linux操作系统极速入门[常用指令]

linux概述: Linux是一套免费使用和自由传播的操作系统 我们为什么要学,Linux? 主流操作系统: linux系统版本: 内核版: 由linux核心团队开发,维护 免费,开源 负责控制硬件 发行版&…

《异常检测——从经典算法到深度学习》25 基于深度隔离林的异常检测算法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

99. 恢复二叉搜索树

#中序遍历,寻找插值位置并交换 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def recoverTree…

CDSP考取的价值:成为数据安全认证专家的好处

哈喽IT的朋友们👋,今天想和大家聊聊一个超级有用的专业认证:CDSP,也就是数据安全认证专家。如果你在数据安全领域或者对这方面感兴趣,这个认证绝对值得你去考取哦! 1.🎓提升专业性:获…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-6根轨迹Root locus

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-6根轨迹Root locus 1. 根的作用2. 手绘技巧3. 分离点/汇合点&根轨迹的几何性质 1. 根的作用 G ( s ) s 3 s 2 2 s 4 G\left( s \right) \frac{s3}{s^22s4} G(s)s22s4s3​…

2024年有哪些热门洗地机值得选购?精选10款洗地机品牌产品

在现今快节奏的生活中,人们往往没有足够的时间来完成家务清洁工作。因此,越来越多的智能清洁家电走进了我们的生活。 例如,最近备受热捧的智能洗地机以其吸、拖、洗三合一的高效清洁能力和智能的一键自清洁功能,深受人们喜爱。 …

使用Node Exporter采集主机数据

安装 Node Exporter 在 Prometheus 的架构设计中,Prometheus Server 并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的 CPU 使用率,我们…

以元旦为题的诗词(二)

都放假了吧,都有空了吧,可坐下来好好学学诗词,好好写些诗词了吧,我先来几首,你实在不行,去百度或者小程序搜索《美诗计》写一写 元旦 去年元日落寒灰,今岁清明在此杯 老眼看书如梦寐&#xff…

docker-compose Install TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 docker download TeamCity TeamCity 文档参考项目离线包百度网盘获取

【Linux】深挖进程地址空间

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉【Linux】进程地址空间 > 毒鸡汤&#xff…

uni-app page新建以及page外观配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

SLAM PnP问题以及相关基础知识

目标泛函 目标泛函是在优化问题中使用的一种数学工具,目标泛函是一个函数,它将一个或多个函数映射到一个实数。它常用于描述需要最小化或最大化的函数。在优化问题中,我们通常希望找到使得某个特定函数取得最大值或最小值的变量值。目标泛函…

合并区间(LeetCode 56)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输…

Google Play上架:2023年度总结报告

今天是2023年的最后一个工作日,今天用来总结一下2023年关于谷歌商店上架的相关政策改动和对应的拒审解决方法。 目录 政策更新与改动2023 年 2 月 22 日2023 年 4 月5 日2023 年 7 月 12 日2023 年 10 月 25 日 开发者计划政策拒审邮件内容和解决办法 政策更新与改…

【js自定义鼠标样式】【js自定义鼠标动画】

文章目录 前言一、效果图二、实现步骤1. 去除原有鼠标样式2. 自定义鼠标样式3. 使用 总结 前言 自定义鼠标形状,自定义鼠标的动画,可以让我们的页面更加有设计感。 当前需求:吧鼠标自定义成一个正方形,鼠标的效果有:和…

AI数字人克隆系统源代码克隆系统开发--本地源码部署

随着人工智能技术的不断发展,AI数字人克隆系统逐渐成为现实。这一系统通过克隆人的外貌和行为模式,可以创建具有自我认知、学习和情感的数字化人类。而为了更好地开发AI数字人克隆系统,本地源码部署是一项关键步骤。 在开始介绍本地源码部署…

Web自动化测试:selenium使用总结

前言 说到自动化测试,就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一,支持快速开发自动化测试框架,且支持在多种浏览器上执行测试。 Selenium学习难度小,开发周期短。对测试人员来说,如果…
最新文章