介绍

  我们用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学习笔记【第七篇】:文件及文件夹操作的更多相关文章

  1. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

  2. Python学习笔记(七)

    Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...

  3. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  4. python学习【第七篇】python文件操作

    一.文件操作过程 1. 打开文件,得到文件句柄并赋值给一个变量2. 通过句柄对文件进行操作3. 关闭文件 # 1.打开文件,得到文件句柄 f_handle = open('aa.txt', 'r', ...

  5. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  6. Python学习笔记【第一篇】:认识python和基础知识

    我的笔记里的python代码运行环境都是在pycharm软件中运行,所以不去记录如何配置环境变量呀什么的. python种类 Cpython: Python的官方版本,使用C语言实现,使用最为广泛,C ...

  7. python学习笔记(六)- 函数、文件json与python字典互操作

    1.函数:(方法.功能) 1.提高代码的复用性 2.让代码更简洁.简化代码 1)定义一个简单的函数 def sayHello(): #函数名,定义函数 print("hello") ...

  8. Python学习笔记——基础语法篇

    一.Python初识(IDE环境及基本语法,Spyder快捷方式) Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,没有编译过程,可移植,可嵌入,可扩展. IDE 1.检查Pyth ...

  9. python学习笔记(十六)之文件

    打开文件用open函数 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=Tru ...

  10. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

随机推荐

  1. .Net 配置的简陋解决方案

    公司是做CS产品的, 最近分配给我一个活, 要求:     1. 公司程序启动时, 检测是否有配置文件, 没有的话则按默认值创建一个     2. 配置文件要加密, 不能让客户随便看到里面的参数   ...

  2. canvas中插入的图片 自适应 ?

    注意 不是用canvas画图 是在canvas中插入图片 我很是惊讶  为啥明明img标签就能解决的非要用canvas 不过别人写好的 我一般不会动 需求是 canvas中的图片自适应不能拉伸…… 老 ...

  3. Posche Piwis 3 Original and Clone – What’s the difference

    Category : Car Diagnostic Tools What’s the difference between Porsche Tester Piwis III original and ...

  4. POJ 2378.Tree Cutting 树形dp 树的重心

    Tree Cutting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4834   Accepted: 2958 Desc ...

  5. SOP - Validation

    Table of Contents目录表1 Roles and Responsibilities related to validation与验证相关的1个角色和职责2 Introduction2引言 ...

  6. CENTOS7上安装MYSQL5.7.21流程

    1系统约定安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql 2下 ...

  7. [c#.net]遍历一个对象中所有的属性和值

    利用反射 SpDictItem sp = GetCFHObject.GetSpItem("); PropertyInfo[] propertys = sp.GetType().GetProp ...

  8. 异步async与await的简单探究

    在学习.net core的过程中,到处见到异步的使用,Task.async.await随处可见.有点疑惑,就去了解了下这个过程是怎样的. 下面是一段代码,去看看是怎么执行的吧. 一.看看异步执行的方式 ...

  9. s6-3 通信模型

    传输层的作用范围 通信5元组 一些已分配的知名端口 三元组 协议. 本地端点. 远方端点 五元组 协议. 本地IP地址.本地端口号. 远端IP地址.远端端口号 通信5元组 源IP 源端口 目的I ...

  10. abaqus修改inp直接建立工程

    前面已经知道,通过修改以下inp的节点和单元编号,就可以新建模型,可是对于大的工程来说,逐个选取单元进行添加材料以及确定哪步进行填土仍是比较麻烦的(如果工程网格划分好并告知哪些单元好属于哪些材料,哪些 ...