python --基础阶段--文件操作(5)

news2024/11/22 4:20:21

文件介绍

数据存放的容器
文件的作用
	持久性的存储数据内容
文件组成
	文件名
		如果是同级目录下, 不允许同名文件存在
	扩展名
		.jpg
		.avi
		.doc
		.xls
		.html
		...
		注意
			一般不同的扩展名, 对应着不同的文件格式
			不同的文件格式, 有着不同的存储约定, 方便程序处理
	文件内容
		文本文件
			txt
			doc
			xls
			...
		二进制文件
			图片
			视频
			音乐
			...

文件的使用流程

打开

open("文件","模式")
	文件
		指定文件路径
	模式
		控制操作模式

模式

r
	以只读方式打开文件
		这是默认模式
	文件的指针将会放在文件的开头
	注意:
		文件不存在, 会报错
w
	以只写方式打开文件
	文件的指针将会放在文件的开头
		所以, 写入的新内容, 会覆盖旧的内容
	注意
		文件不存在, 会自动创建一个新文件
a
	以追加方式(只写)打开文件
	文件的指针将会放在文件结尾
		所以, 写入的内容, 会新增到文件末尾
	注意
		文件不存在, 会自动创建一个新文件
# 1. 打开文件

# 相对路径, 相对于哪一个目录下面的指定文件
f = open("a.txt", "r")

# 2. 读写操作
content = f.read()
print(content)

f.write("88888")# 会报错,因为当前f为只读模式

# # 3. 关闭文件
# f.close()
增加b
	rb
	wb
	ab
	以二进制格式进行操作文件读写
		如果文件是二进制文件, 则选择此项
		例如
			图片
			视频
			音频
			...
# 1. 打开xx.jpg文件, 取出内容, 获取内容的前面半部分
# 1.1 打开文件
fromFile = open("xx.jpg", "rb")

# 1.2 读取文件内容
fromContent = fromFile.read()
print(fromContent)

# 1.3 关闭文件
fromFile.close()


# 2. 打开另外一个文件xx2.jpg, 然后, 把取出的半部分内容, 写入到xx2.jpg文件里面去
# 2.1 打开目标文件
toFile = open("xx2.jpg", "wb")

# 2.2 写入操作
content = fromContent[0: len(fromContent) // 2]
toFile.write(content)


# 2.3 关闭文件
toFile.close()
增加+
	r+
		1.与 r的区别
		2. 与 写 和 w的区别
	w+
	a+
	rb+
	rw+
	ra+
	代表都是以 "读写模式" 进行打开
		其他特性基本和 + 前面的模式一致
		但是关于部分操作, 有细节区别
	作业:
		自己做测试, 验证区别

读写

定位

f.seek(偏移量,[0,1,2])
	0
		表示开头位置【默认】
	1
		表示当前位置
	2
		表示文件末尾位置
	注意
		文本文件的操作模式下(不带b)
			只能写0
		如果想要写1、2, 必须在二进制文件操作模式下(带b)
f.tell()
	查看当前位置
f = open("a.txt", "r")

print(f.tell())
f.seek(2)
f.seek(-22)  # 文件末尾位置,前移两个偏移量
print(f.tell())
print(f.read())
print(f.tell())

f.close()

f.read(字节数)
	字节数默认是文件内容长度
	下标会自动后移

f.readline([limit])
	读取一行数据
	limit
		限制的最大字节数

f.readlines()
	会自动的将文件按换行符进行处理
	将处理好的每一行组成一个列表返回

for in
	可以直接遍历 f 本身
	也可以遍历行列表
判定是否可读
	.readable()
注意
	一般文件特别大的时候, 可以使用readline方法
		按行加载, 可节省内存
		但相比于其他两个读取方法, 性能较低
	其他两个方法, 一次性读取文件所有内容
		虽然占用内存
		但处理性能比较高
#f.read(字节数)
#	字节数默认是文件内容长度
#	下标会自动后移e
	
f.seek(2)
content = f.read(2)
print(f.tell())
print(content)



# f.readline([limit])
# 	读取一行数据
# 	limit
# 		限制的最大字节数
print("----", f.tell())
content = f.readline()
print(content, end="")
print("----", f.tell())

content = f.readline()
print(content, end="")

print("----", f.tell())

content = f.readline()
print(content, end="")

print("----", f.tell())



# f.readlines()
# 	会自动的将文件按换行符进行处理
# 	将处理好的每一行组成一个列表返回

content = f.readlines()
print(content)

f.close()


import collections


#	for in
#		可以直接遍历 f 本身
#		也可以遍历行列表
f = open("a.txt", "r")

print(isinstance(f, collections.Iterator)) # 判定是否是迭代器
# 可以遍历自身
for i in f:
    print(i, end="")
    
##	判定是否可读
##		.readable()
if f.readable():
	# 可以遍历行列表
    content = f.readlines()
    for i in content:
        print(i, end="")

f.close()

f.write("内容")
	返回值是写入的字节长度
判定是否可写
	.writeable()
f = open("a.txt", "w")
if f.writable():
	print(f.write("123"))

关闭

f.close()
	关闭文件
	为什么需要关闭?
		打开状态, 会占用系统资源
		会把缓冲区内容清空到磁盘文件中
补充
	f.flush()
	清空缓冲区内容到磁盘文件中
f = open("a.txt", "w")
if f.writable():
	print(f.write("123"))

f.flush()

f.close()

文件的相关操作

模块
	import os
信息获取操作
	.closed
		返回true如果文件已被关闭,否则返回false
	.name
		返回文件的名称
其他操作
	重命名
		os.rename(‘old_name’, 'new_name')
	删除
		删除文件
			os.remove('文件名')
				文件不存在会报错
		删除目录
			os.rmdir(path)
				不能递归删除目录
				如果文件夹非空,会报错
			os.removedirs(path)
				可以递归的删除目录,即删除该路径上的所有文件夹
				如果文件夹非空会报错
	创建文件夹
		os.mkdir("文件夹名称"[,mode])
			不能递归创建【即不多多级创建】
		数字模式权限
			文件拥有者
				读
					r
					4
				写
					w
					2
				可执行
					x
					1
			同组用户
				读
					r
					4
				写
					w
					2
				可执行
					x
					1
			其他用户
				读
					r
					4
				写
					w
					2
				可执行
					x
					1
	获取当前目录
		os.getcwd()
	改变默认目录
		os.chdir("目标目录")
	获取目录列表
		os.listdir("./")
import os
# 重命名
os.rename("b.txt", "bb.txt")
os.rename("first", "one")

os.rename("one/one.txt", "two/two.txt") 

os.renames("one/one.txt", "two/two.txt") #会一级一级向上修改文件名称



# 删除
## 删除文件
os.remove("xx2.jpg")
## 删除文件夹
os.rmdir("one/one2")  # 会报错

os.removedirs("one/one2")  # 可以递归的删除目录,即删除该路径上的所有文件夹



# 创建文件夹
os.mkdir("a")
os.mkdir("b/c/d")  # 会报错,只能创建一级目录,不能创建多级目录

# 创建文件夹并设置权限
os.mkdir("b", 0o777)
# 切换文件目录
os.chdir("a")

open("dd.txt", "w")




# 获取当前目录
os.getcwd()
print(os.getcwd())

# 改变默认目录
os.chdir("目标目录")


# 获取目录内容列表
# 列举当前a目录下的所有文件,结果是列表
print(os.listdir("a"))

# 列举当前所在目录下的一级内容。文件、文件夹等,注意:不包含文件夹下的深层内容
print(os.listdir("./"))

# 列举当前所在目录的上一级目录下的内容。文件、文件夹等,注意:不包含文件夹下的深层内容
print(os.listdir("../"))

案例

文件的复制

import os

os.chdir("files")   # 切换目录

#1. 只读模式, 打开要复制的文件
# # 	追加模式, 打开副本文件

source_file = open("d.txt", "r", encoding="utf-8")
dst_file = open("d_bat.txt", "a", encoding="utf-8")

# # 2. 从源文件中读取内容
# # 	写入到目标文件中
# content = source_file.read()
# dst_file.write(content)
    
## 大文件处理
while True:
   content = source_file.read(1024)
   if len(content) == 0:
       break
   dst_file.write(content)
    
#3. 关闭源文件和目标文件
source_file.close()
dst_file.close()

批量重命名

文件分类,并生成文件清单

给定一批不同格式的文件;按照文件夹后缀名,划分到不同的文件夹;生成 .txt 格式的文件清单,清单标明不同的格式分别有那些文件
# 文件分类

# 0, 获取所有的文件名称列表
import os
import shutil

path = "files"

if not os.path.exists(path):
    exit()

os.chdir(path)
file_list = os.listdir("./")
# print(file_list)

# 1. 遍历所有的文件(名称)
for file_name in file_list:
    # print(file_name)
    # 2. 分解文件的后缀名
    # 2.1 获取最后一个.的索引位置 xx.oo.txt
    index = file_name.rfind(".")
    if index == -1:
        continue
    # print(index)
    # 2.2 根据这个索引位置, 当做起始位置, 来截取后续的所有字符串内容
    extension = file_name[index + 1:]
    print(extension)

    # 3. 查看一下, 是否存在同名的目录

    # 4. 如果不存在这样的目录 -> 直接创建一个这样名称的目录
    if not os.path.exists(extension):
        os.mkdir(extension)

    shutil.move(file_name, extension)

    # 5, 目录存在 -> 移动过去


# 生成文件清单

# 通过给定的文件夹, 列举出这个文件夹当中, 所有的文件,以及文件夹, 子文件夹当中的所有文件
def listFilesToTxt(dir, file):
    # 1. 列举出, 当前给定的文件夹, 下的所有子文件夹, 以及子文件
    file_list = os.listdir(dir)
    # print(file_list)
    # 2. 针对于, 列举的列表, 进行遍历
    for file_name in file_list:
        new_fileName = dir + "/" + file_name
        # 判定, 是否是目录, listFiles
        if os.path.isdir(new_fileName):
            # print(new_fileName)
            file.write(new_fileName + "\n")
            listFilesToTxt(new_fileName, file)
        else:
             # 打印下, 文件名称
            # print("\t" + file_name)
            file.write("\t" + file_name + "\n")
    # print("")
    file.write("\n")

f = open("list.txt", "a")
listFilesToTxt("files", f)

补充-数字模式权限

如何在Python中读取文件的权限模式?

在 Python 中,你可以使用 os 模块来读取文件的权限模式。os 模块提供了一些函数来获取文件和目录的信息,包括权限模式。

import os

# 替换为你要读取权限的文件路径
file_path = "your_file_path"

# 使用 os.stat() 函数获取文件的状态信息
file_stat = os.stat(file_path)

# 获取权限模式
mode = file_stat.st_mode

# 打印权限模式
print("权限模式:", oct(mode))
在上面的示例中,首先指定要读取权限的文件路径。然后,使用 os.stat() 函数获取文件的状态信息,并将其存储在 file_stat 变量中。file_stat 对象包含了文件的各种信息,包括权限模式。

通过访问 file_stat.st_mode 属性,可以获取到文件的权限模式。最后,使用 oct() 函数将权限模式转换为八进制表示,并打印出来。

请注意,权限模式的八进制表示通常以 "0o" 开头,表示这是一个八进制数。每个数字位对应着不同的权限,例如前三位表示所有者的权限,接下来三位表示组的权限,最后三位表示其他用户的权限。

通过这种方式,你可以在 Python 中读取文件的权限模式,并根据需要进行进一步的处理或分析。

数字如何表示权限

首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,

如:

	rwx = 4 + 2 + 1 = 7

	rw = 4 + 2 = 6

	rx = 4 +1 = 5

即

	若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7

	若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6

	若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5

上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。

Linux上通常使用chmod命令对文件的权限进行设置和更改

chmod [可选项] <mode> <file…>

参数说明:

[可选项]
  -c, --changes          like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
  -f, --silent, --quiet  suppress most error messages  (若该档案权限无法被更改也不要显示错误讯息)
  -v, --verbose          output a diagnostic for every file processed(显示权限变更的详细资料)
       --no-preserve-root  do not treat '/' specially (the default)
       --preserve-root    fail to operate recursively on '/'
       --reference=RFILE  use RFILE's mode instead of MODE values
  -R, --recursive        change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
       --help		显示此帮助信息
       --version		显示版本信息
[mode] 
    权限设定字串,详细格式如下 :
    [ugoa...][[+-=][rwxX]...][,...],

    其中
    [ugoa...]
    u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
    [+-=]
    + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
    [rwxX]
    r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
 	
[file...]
    文件列表(单个或者多个文件、文件夹)

示例

1、设置所有用户可读取文件 a.conf

chmod ugo+r a.conf 
 或
chmod a+r  a.conf

2、设置 c.sh 只有 拥有者可以读写及执行

chmod u+rwx c.sh

3、设置文件 a.conf 与 b.xml 权限为拥有者与其所属同一个群组 可读写,其它组可读不可写

chmod a+r,ug+w,o-w a.conf b.xml

4、设置当前目录下的所有档案与子目录皆设为任何人可读写

chmod -R a+rw *

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Ubuntu 上安装 Jellyfin 媒体服务器

Jellyfin 是一个开源的媒体服务器软件&#xff0c;让你可以整理、管理和流式传输你的个人媒体收藏&#xff0c;比如电影、音乐、电视节目和照片&#xff0c;而且完全免费&#xff0c;没有订阅费用或数据收集的担忧。 简介 媒体管理&#xff1a;Jellyfin 整理媒体库&#xff0…

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…

实时直播平台如何实现美颜功能?第三方美颜API与美颜SDK的技术

通过实时美颜技术&#xff0c;主播可以轻松实现肤色优化、五官调整以及滤镜效果&#xff0c;极大提升观众的观看体验。本篇文章&#xff0c;小编将深入讲解实时直播平台如何通过第三方美颜API与美颜SDK实现美颜功能&#xff0c;以及其中的技术实现与关键要点。 一、实时美颜的…

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…

Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好

目的 为了将ubuntu服务器IP固定, 方便ssh连接人在服务器前使用图形化界面设置 设置 找到自己的网卡名称, 我的是 eno1, 并进入设置界面 查看当前的IP, 网关, 掩码和DNS (注意对应eno1) nmcli dev show掩码可以通过以下命令查看完整的 (注意对应eno1) , 我这里是255.255.255.…

实现一个string的indexof方法,给出时空复杂度估计

文心快码(BaiduComate)是基于百度文心大模型&#xff0c;在研发全流程全场景下为开发者提供辅助建议的智能代码助手。结合百度积累多年的编程现场大数据、外部优秀开源数据&#xff0c;可为开发者生成更符合实际研发场景的优秀代码&#xff0c;提升编码效率&#xff0c;释放“十…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

【lamafactory BLEU ROUGLE L评测】

1、BLEU/ROUGLE评测界面 2、这个是用BLEU 和ROUGL来评测 目录&#xff1a;saves/Qwen2-7B-Chat/lora/eval_2024-11-14-16-28-19/ 在saves文件夹 生成的文件如下 all_results.json文件 说明模型在这个测试集上是不好的 3、可以查看预测结果的文件 predict_result.json

Ros Noetic 20.04 跑通mpc_ros包保姆级教程

前言: 本文将简述mpc_ros包在noetic20.04中的安装,mpc是 一种跟踪、MPC_ROS 是一个基于ROS(Robot Operating System)的模型预测控制(Model Predictive Control,MPC)库。该项目旨在为机器人控制提供一个灵活且高效的MPC实现,使得开发者能够在ROS环境中轻松集成和使用MPC…

游戏+AI的发展历程,AI技术在游戏行业的应用有哪些?

人工智能&#xff08;AI&#xff09;与游戏的结合&#xff0c;不仅是技术进步的体现&#xff0c;更是人类智慧的延伸。从最初的简单规则到如今的复杂决策系统&#xff0c;AI在游戏领域的发展历史可谓波澜壮阔。 早在2001年&#xff0c;就有研究指出游戏人工智能领域&#xff0…

HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发

Form Kit简介 Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff08;以下简称“卡片”&#xff09;&#xff0c;以达到服务直达、减少跳转层级的体验效果。卡片常用于嵌入到其他应用&#xff0…

Redis的过期删除策略和内存淘汰机制以及如何保证双写的一致性

Redis的过期删除策略和内存淘汰机制以及如何保证双写的一致性 过期删除策略内存淘汰机制怎么保证redis双写的一致性?更新策略先删除缓存后更新数据库先更新数据库后删除缓存如何选择&#xff1f;如何保证先更新数据库后删除缓存的线程安全问题&#xff1f; 过期删除策略 为了…

单元测试框架gtest学习(三)—— 事件机制

前言 上节我们学习了gtest的各种宏断言 单元测试框架gtest学习&#xff08;二&#xff09;—— 认识断言-CSDN博客 本节我们介绍gtets的事件机制 虽然 Google Test 的核心是用来编写单元测试和断言的&#xff0c;但它也允许在测试执行过程中进行事件的钩取和自定义&#xf…

Unity Inspector窗口可编辑的脚本变量

Inspector可编辑的脚本变量 默认会显示的变量 在Unity中&#xff0c;为了方便我们进行一些属性的设置及调试&#xff0c;我们所写的公有基础数据类型会显示在Inspector之中&#xff0c;我们可以对他进行设置来更改它的取值。 显示私有变量 在有些情况下&#xff0c;设计代码…

力扣 LeetCode 110. 平衡二叉树(Day8:二叉树)

解题思路&#xff1a; 等于 -1 时&#xff0c;直接 return -1 class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root) ! -1;}public int getHeight(TreeNode root) {if (root null) return 0;int leftDepth getHeight(root.left);if (leftDep…

unity3d————基础篇小项目(设置界面)

代码示例&#xff1a; 设置界面 using System.Collections; using System.Collections.Generic; using UnityEngine;public class SettingPanel : BasePanel<SettingPanel> {public UIButton btnClose;public UISlider sliderMusic;public UISlider sliderSound;public…

商用密码产品认证名录说明

《商用密码产品认证目录》是为贯彻落实《中华人民共和国密码法》&#xff0c;进一步健全完善商用密码产品认证体系&#xff0c;更好满足商用密码产业发展需要&#xff0c;根据《国家密码管理局 市场监管总局关于调整商用密码产品管理方式的公告》《市场监管总局 国家密码管理局…

从零做一个遥控玩具,需要学什么

遥控玩具编程是一个充满乐趣和挑战的领域&#xff0c;它完美地结合了硬件控制和软件编程。记得小时候拿着遥控器操控玩具汽车&#xff0c;总觉得神奇。如今站在程序员的视角&#xff0c;终于明白这背后是怎样的技术在支撑。 这些有趣的遥控玩具&#xff0c;其核心都是基于单片…

java的web项目如何连接数据库

mysql-connector.jar 是一个Java库文件&#xff0c;它提供了Java应用程序与MySQL数据库进行交互的接口 首先准备好这个文件&#xff0c;没有的话在网上搜索 将它放在这个位置&#xff0c;MySQL连接配置就好了&#xff0c; 如果拖不进去&#xff0c;右击项目名称&#xff0c;…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…