介绍

  我们用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. 基于角色的访问控制 (RBAC)权限管理

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  2. Linux查看机器负载

    负载(load)是linux机器的一个重要指标,直观了反应了机器当前的状态.如果机器负载过高,那么对机器的操作将难以进行. Linux的负载高,主要是由于CPU使用.内存使用.IO消耗三部分构成.任意 ...

  3. debian proftpd安装

  4. 基础汇编指令(16bit 32bit 64bit)

    (zz from http://blog.luoyuanhang.com/) ##常见寄存器 寄存器 16位 32位 64位 累加寄存器 accumulator AX EAX RAX 基址寄存器 ba ...

  5. 爬虫利器 Puppeteer 实战

    Puppeteer 介绍 Puppeteer 翻译是操纵木偶的人,利用这个工具,我们能做一个操纵页面的人.Puppeteer是一个Nodejs的库,支持调用Chrome的API来操纵Web,相比较Se ...

  6. Autel MaxiTPMS TS601 Wireless TPMS Sensor Reset Relearn Activate Programming Tool

    Why Choose Autel TPMS TS601? MaxiTPMS TS601 is a TPMS tool with highest performance in the world. It ...

  7. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  8. vue的一些注意点

    每个 Vue 实例都会代理其 data 对象里所有的属性. 注意只有这些被代理的属性是响应的.如果在实例创建之后添加新的属性到实例上,它不会触发视图更新. 除了 data 属性,Vue实例暴露了一些有 ...

  9. thinkphp 5 使用oss

    简单的tp5中上传到 图片到oss我本地开发环境为:WAMP;php版本:5.6.19TP版本:5.1.13 1.使用composer 安装 composer require aliyuncs/oss ...

  10. CUDA C

    一.CUDA结构 硬件:GPU(Graphics Processing Unit)   SM(Streaming Multiprocessor)     SP(Streaming Processor) ...