Python学习笔记【第七篇】:文件及文件夹操作
介绍
我们用pytthon、C#、Java等这些编程语言,想要把文件(文字、视频....)永久保存下来就必须将文件写入到硬盘中,这就需要我们应用程序去操作硬件,我们这些编程语言是无法直接操作硬件的。就需要操作系统把复杂的硬件操作封装成接口给应用程序调用。这样用户\应用程序就能对文件进行操作了。
操作文件
在Python中内置一个open对象是操作文件的方法。
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
文件操作流程
#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作
data=f.read() #3. 关闭文件
f.close()
注意!!!
#第一点:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量 推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文
with open('a.txt','w') as f:
pass with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
#第二点:
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
打开文件的模式
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
操作文件的方法
f.read() # 读取所有内容,光标移动到文件末尾
f.readline() # 读取一行的内容,光标移动到第二行首部
f.readlines() # 读取每一行内容,返回列表
data = '写入内容'
f.write(data) # 写入文件,需要自己添加换行
f.write(data,encoding='utf-8')# 写入文件并且指定写入文件的编码格式
f.writeline(['1','2','3']) # 文件以列表形式写入
f.readable() # 文件是否可读
f.writeable() # 文件是否可写
f.closed # 文件是否关闭
f.encoding # 如果文件打开模式为b ,则没有该属性
f.flush() # 立刻将文件内容从内存刷到硬盘上
f.name # 文件名称
文件内光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
文件的修改
文件是存在硬盘上的,因而只存在覆盖,不存在修改如果想要修改文件就如下两种方式。
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
# -*- coding: utf-8 -*- # 声明字符编码
# coding:utf-8
import os # with open('../files/a.txt', 'r', encoding='utf-8') as a_f, open('../files/b.txt', 'w', encoding='utf-8') as b_f:
# a_data = a_f.read()
# a_data = a_data + "方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件"
# b_f.write(a_data)
# os.remove('../files/a.txt')
# os.rename('../files/b.txt', '../files/a.txt') with open('../files/a.txt', 'r', encoding='utf-8') as a_f, open('../files/b.txt', 'w', encoding='utf-8') as b_f:
for line in a_f:
b_f.write(line)
b_f.write("方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件")
os.remove('../files/a.txt')
os.rename('../files/b.txt', '../files/a.txt')
文件操作练习
# -*- coding: utf-8 -*- # 声明字符编码
# coding:utf-8
# 文件全类容
file_list = [] # 定义文件生成器
def file_generator():
with open('../files/haproxy.conf', 'r', encoding='utf-8') as f:
for row in f:
yield row # 判断当前内容是否包含
def is_contain(str):
str = "backend %s" % str
flag = False
# 获取读取文件生成器
generator = file_generator()
for row in generator:
r = row.strip()
file_list.append(r)
if r == str:
flag = True print(file_list)
return flag # 查询
def fetch():
# 是否查到标识
flag = False
print('=========欢迎进入查询功能=========')
content = input('请输入您要查询的内容:')
# 获取读取文件生成器
generator = file_generator()
backend_data = "backend %s" % content
for row in generator:
r = row.strip()
# 查到了,如果开头为"backend"说明已经结束了。
if flag is True and r.startswith('backend'):
break
if r == backend_data or flag is True:
flag = True
# 打印查询到的信息
print(r)
else:
if flag is False:
print('未查到当前节点下的内容。。。。') # 新增
def insert():
# 直接在文件中新加内容
print('=========欢迎进入新增功能=========')
content = input('请输入您要新增的内容:')
if content is None:
print("新增内容不能为空")
# 思路也是先查询出原内容,组成列表,通过索引添加内容,在重写到原来的文件中
pass # 修改
def update():
print('=========欢迎进入修改功能=========')
# data = [{'backend': 'www.oldboy1.org', 'record': {'server': '2.2.2.4', 'weight': 20, 'maxconn': 3000}},{'backend': 'www.oldboy1.org', 'record': {'server': '3.3.3.3', 'weight': 30, 'maxconn': 1000}}]
content = input('请输入您要查询的内容:').strip()
# eval 转为列表结构
data = eval(content) if is_contain(data[0]['backend']) is True:
# 获取要修改的源数据
old_server_record = '%sserver %s %s weight %s maxconn %s\n' % (' ' * 8, data[0]['record']['server'],
data[0]['record']['server'],
data[0]['record']['weight'],
data[0]['record']['maxconn'])
# 要修改的数据
new_server_record = '%sserver %s %s weight %s maxconn %s\n' % (' ' * 8, data[1]['record']['server'],
data[1]['record']['server'],
data[1]['record']['weight'],
data[1]['record']['maxconn']) old_server_record = old_server_record.strip()
new_server_record = new_server_record.strip()
print(old_server_record)
print(new_server_record) print('修改前列表:')
print(file_list)
if old_server_record not in file_list:
print('你要修改的记录不存在')
else:
index = file_list.index(old_server_record)
file_list[index] = new_server_record
print('修改后列表:')
print(file_list)
# 重新覆盖文件
with open('../files/haproxy.conf', 'w+', encoding='utf-8') as f:
# 写入后就变成一行了???
f.writelines(file_list) else:
print('对不起你要修改的内容不存在。。。') # 删除
def delete():
# 思路也是先查询出原内容,组成列表,通过索引删除内容,在重写到原来的文件中
pass if __name__ == "__main__":
msg = """
1:查询
2:新增
3:修改
4:删除
5:退出
"""
msg_dic = {
'1': fetch,
'2': insert,
'3': update,
'4': delete
}
while True:
print(msg)
# 接收用户输入并且去除空格
choice = input("请输入功能选择:").strip()
if choice == '5': break
operation = msg_dic.get(choice)
# print(operation) # 打印的是函数地址
if operation is not None:
# 调用函数
operation()
else:
print("系统暂无此功能。。。")
文件夹及路径操作方法
对于文件夹的操作,首先我们要导入os模块
import os =====OS模块==== os.getcwd():获取当前路径
os.listdir():展示当前目录内容 返回一个列表
os.chdir():改变当前路径
os.mkdir():创建目录
os.rmdir():删除目录
os.remove():删除文件
os.rename():重命名 os.path.isdir():判断是否是一个目录
os.path.isfile():判断是否是一个文件
os.path.join():路径拼接
os.path.dirname():所在目录/父及目录
os.path.abspath():绝对路径
os.path.relpath():相对路径
os.path.normpath():规范化路径
os.path.getsize():资源大小
os.path.getctime/getatime/getmtime:资源时间
os.path.exists():路径是否存在
os.path.isabs():是否是绝对路径 '''
Python学习笔记【第七篇】:文件及文件夹操作的更多相关文章
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- Python学习笔记(七)
Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- python学习【第七篇】python文件操作
一.文件操作过程 1. 打开文件,得到文件句柄并赋值给一个变量2. 通过句柄对文件进行操作3. 关闭文件 # 1.打开文件,得到文件句柄 f_handle = open('aa.txt', 'r', ...
- MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片
1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...
- Python学习笔记【第一篇】:认识python和基础知识
我的笔记里的python代码运行环境都是在pycharm软件中运行,所以不去记录如何配置环境变量呀什么的. python种类 Cpython: Python的官方版本,使用C语言实现,使用最为广泛,C ...
- python学习笔记(六)- 函数、文件json与python字典互操作
1.函数:(方法.功能) 1.提高代码的复用性 2.让代码更简洁.简化代码 1)定义一个简单的函数 def sayHello(): #函数名,定义函数 print("hello") ...
- Python学习笔记——基础语法篇
一.Python初识(IDE环境及基本语法,Spyder快捷方式) Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,没有编译过程,可移植,可嵌入,可扩展. IDE 1.检查Pyth ...
- python学习笔记(十六)之文件
打开文件用open函数 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=Tru ...
- python学习笔记-(七)python基础--集合、文件操作&函数
本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...
随机推荐
- postman笔记1--postman的安装教程
一.postman插件的安装 第一步:首先在网上下载postman插件的安装包,下载到自己的本地进行解压(如果懒得去下载的同学,可以根据网盘分享的安装包去下载:链接:https://pan.baidu ...
- 设计模式学习心得<组合模式 Composite>
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- Eclispe 错误:找不到或无法加载加载主类
解决办法: Project --> Clean Clean 操作会将该 project 以前的所有编译信息清空,然后默认将所有工程的所有 .java 文件都进行一次编译,这样的话就可以方便的进行 ...
- SpringBoot放置在static下面的静态页面无法访问
最近写项目本来写的好好的,突然static的静态页面访问不了了. 于是我各种上网查资料,看大佬的解决方案,还是没有解决. 直到发现了这篇文章 https://blog.csdn.net/cmqwan/ ...
- 奇异值分解(SVD)
首先说明一下特征值:设A是n阶方阵,如果存在 λ 和n维非零向量X,使 AX = λX ,则 λ 称为方阵A的一个特征值,X为方阵A对应于或属于特征值 λ 的一个特征向量. AX = λX 的过程是一 ...
- java之路 定义个一初始值 取它 个位 十位 百位 千位。。的数值。
class Demo{ public static void main(String[] args){ int i =2584; //do{ int g = i%10; int s = (i%100) ...
- MongoDB学习记录(三) - MongoDB的"增查改删"操作之"查"
查找使用的方法: db.collection.find() 查找所有文档 db.collection.find({})或者db.collection.find({}) 指定键值对 db.collect ...
- angular的一些东西
每个人都知道在使用angular的时候只能有一个ng-app指令但是也可以手动创建,这样就可以写很多个模块 例: var app=angular.module('App',[]);var app1=a ...
- 批量运维SQl生成,可以用EXCEl,也可以SQL查询生成
select 'insert into Base_VehiclesInformation (ID,CarModelID,FistRegTime,ScrappageDate, Creator,Creat ...
- 动态库的链接和链接选项-L,-rpath-link,-rpath
https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行 ...