1.1. 对文件操作基本操作

操作流程:

打开文件,得到文件句柄并赋值给一个变量

通过句柄对文件进行操作

关闭文件

注意pyton中操作的文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

简单的文件介绍

文件一旦定义,就不能修改,只能是重新写入新的文件/覆盖

with open('hhh.txt', 'r') as f:
print(f.read()) # UnicodeDecodeError: 'gbk' codec can't decode byte 0x98 in position 66: illegal multibyte sequence
# 中文是GBK,不能直接转换为bytes,所以报错[Py3中只有bytes和str,所以转换不了bytes,也就转换不了unicode,需要说明的是unicode向下兼容utf-8]
# 打开文件流,以读写的方式 【错误的】
f = open('hhh', 'rw', encoding='utf-8')

附文件操作模式:

注意: w+模式任然会清空文件内容

读的时候永远从光标0开始, 写的时候永远都是从最后开始写,文件不能修改,但是可以复制文件到新的文件里面进行操作【基于内存本来的机制限制】

打开文件流,以w+方式

# 打开文件流,以w+方式
f = open('hhh', 'w+', encoding='utf-8')
# 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
f.write("how are you") # 写之前清空文件
f.flush()
# f.seek(0) # 写完后光标移动到文件尾部,所以读取不到文件
print(f.read())
# 关闭文件流
f.close()

文件的读操作

只能以一种模式打开  r/w/a/x/t/+   具体参见上图

输出的时候,python里面的光标也会跟着print同步转移,下一次print会打印下一行

# version: python3.2.5
# author: ‘FTL1012
# time: 2017/12/8 12:16 # 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
print(f.read(1)) # 打印一个字符
print(f.readline()) # 读取一行
# print(f.readline(5)) # 读取一行中的前5个字符
# print(f.readlines()) # 多行读取,并组成一个列表
# 打印全部文字/字符
file = f.read()
print(file)
# 关闭文件流
f.close()

注意:readlines()读取会返回一个列表,for循环打印的时候,会读取到文本后的换行符,默认会打印出来

f = open('hhh', 'r', encoding='utf-8')
for i in f.readlines():
print(i.strip()) # 默认会打印出来后面的换行符,所以在这里进行了过滤
# 关闭文件流
f.close()

另:# 在特定的行添加 I love U

方案一:直接读取列表
# print(f.readlines()[1].strip()+'I love U')
# print(''.join((f.readlines()[1].strip()+'I love U')))
方案二:自定义变量
# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 读取文件
date = f.readlines()
# 关闭文件流
f.close() # 读取出来列表后,关闭文件,继续在内存中操作,不影响后面读取文件,效率高
num = 0
for i in date:
num += 1
if num == 2:
print(i.strip(),'\t I love U')
else:
print(i.strip())
方案三: enumerate添加序列
# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 文件操作,仅仅作输出显示用
for i, v in enumerate(f.readlines()):
if i == 1:
v = ''.join([v.strip(), ' I love U'])
print(i, v.strip())
# 关闭文件流
f.close()
方案四: 仅仅作输出显示用
# 打开文件流,以追加写的方式
f = open('hhh', 'r+', encoding='utf-8')
num = 0
for line in f:
num += 1
if num == 3:
line = ''.join([line.strip(), ' hello'])
print(line.strip())
# 关闭文件流
f.close()

文件的写入:

【没有文件,会创建文件,文件存在会清空原来的内容,重新写入】

# 打开文件流,以写的方式
f = open('hello', 'w', encoding='utf-8')
# 写内容进文件
file = f.write("hello world 2017")
# 关闭文件流
f.close()

文件的追加写入,默认在结尾直接追加,紧贴着原来

# 打开文件流,以追加的方式
f = open('hello', 'a', encoding='utf-8')
# 写内容进文件
f.write("\r黄山百战穿金甲,不破楼兰终不还\r") # 这里增加了换行\r黄山
f.write("夜阑卧听风吹雨,铁马冰河入梦来\r")
f.write("--2017-12-08".rjust(38, ' ')) # 增加了向右边增加空格的操作
# 关闭文件流
f.close()

文件的其他操作:

tell(): 查找光标, 英文字母读一个光标移动一次,中文读一个字符光标移动3个位置

tell读取英文:

# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
print(f.tell())
print(f.read(3))
print(f.tell())
# 关闭文件流
f.close()

tell()读取:记录光标的位置

# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
print(f.tell())
print(f.read(3))
print(f.tell())
# 关闭文件流
f.close()

文件的seek()操作:调整光标的位置,一般用于文件的断点传播,迅雷下载

# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 文件操作,直接操作文件,Python会自动将for作为一个迭代器来输出,用一个选择一个来输出
print("调整前:", f.tell())
print(f.read(3))
print(f.tell())
f.seek(0)
print("调整后:", f.tell())
print(f.read(3))
print(f.tell())
# 关闭文件流
f.close()

文件的flush()操作:将缓存中的数据写入到硬盘

文件的flush()应用:打印进度条

import sys, time
for i in range(30):
# sys.stdout 相当于f对象
sys.stdout.write('.')
# 如果不添加flush(),则会等到30秒之后,一起打印出来30个dian
sys.stdout.flush()
time.sleep(1)

文件的truncate(): 文件的阶段,默认从头开始截取全部,相当于删除文件内容

适用于append模式,因为w模式默认会先truncate()

不常用

文件的fileno():返回一个整数,代表文件描述符,在内存中唯一的

文件的isatty ():判断文件是否是终端

文件选优操作

[推荐]文件的迭代输出:不再内存中操作文件,用一个从硬盘读取一行[默认输出一行],用完就结束

小文件,相比较readlines效率低一点,因为有一个转换的过程。大文件有优势,不占用内存

解释:readlines会将整个的文件读取到内存中,但是相对于10G等大文件,内存吃不消,所以建议文件读的时候,用for提供迭代器输出,用一行读取一行到内存,用完就释放内存。

文件的迭代输出

# 打开文件流,以读的方式
f = open('hhh', 'r', encoding='utf-8')
# 直接操作文件,Python会自动将f对象作为一个迭代器来输出,用一个选择一个来输出
for i in f:
print(i.strip())
# 关闭文件流
f.close()

文件操作之修改磁盘文件:

# 在第二行添加一句 Hello 2017
f_read = open('hhh', 'r', encoding='utf-8')
f_write = open('hhh_2', 'a+', encoding='utf-8')
num = 0
for i in f_read:
num += 1
if num == 2:
i = ''.join([i.strip(), '\t Hello 2017'])
f_write.write(i.strip()+'\n')
f_write.flush()
f_read.close()
f_write.close()

with语句

with语句为了避免打开文件后忘记关闭,可以通过管理上下文,当with代码块执行完毕时,内部会自动关闭并释放文件资源。【在Python 2.7 后,with又支持同时对多个文件的上下文进行管理】

with open('hhh', 'r', encoding='utf-8') as f1, open('hhh_2', 'r', encoding='utf-8') as f2:
print(f1.read())
print("----------------------------------")
print(f2.read())
# python会自动关闭释放内存

字典的文件读取:

dic = str({'name':'hhh', 'age':23})

with open('hhh', 'r', encoding='utf-8') as f:
# f.write(dic)
date = f.read()
print(eval(date)['age'])
print(eval(date)['name'])

三级菜单升级版[增加文件+增删改]

1. 展示省市区(数据在文件中)

2. 可以增加新的省份,文件会更新

【三级菜单参考】

Python实例---三级菜单的实现[low]

Python实例---三级菜单的实现[high]

Python学习---文件操作的学习1208的更多相关文章

  1. Python :open文件操作,配合read()使用!

    python:open/文件操作 open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) 如何打开文件 handle=open(file_name,a ...

  2. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  3. 孤荷凌寒自学python第三十三天python的文件操作初识

     孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...

  4. Python 常见文件操作的函数示例(转)

    转自:http://www.cnblogs.com/txw1958/archive/2012/03/08/2385540.html # -*-coding:utf8 -*- ''''' Python常 ...

  5. python中文件操作的六种模式及对文件某一行进行修改的方法

    一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...

  6. python中文件操作的其他方法

    前面介绍过Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open('poems','r', ...

  7. Python常见文件操作的函数示例

    # -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname() ...

  8. python的文件操作及简单的用例

    一.python的文件操作介绍 1.文件操作函数介绍 open() 打开一个文件 语法:open(file, mode='r', buffering=-1, encoding=None, errors ...

  9. python基本文件操作

    python文件操作 python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了 基本的文件操作 要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式 ...

随机推荐

  1. Linux 下使用yum 命令安装MySQL

    Linux下使用yum安装MySQL,以及启动.登录和远程访问MySQL数据库. 1.yum安装mysql 1. 查看有没有安装包:   yum list mysql*    #移除已经安装的mysq ...

  2. Linux系统快速查找文件

    有时候下载新的文件或安装新的包 但是却搞不清默认放在哪个目录了,这个时候可以使用locate命令进行快速模糊查找 比如我使用 go get github.com/coreos/bbolt/... 在一 ...

  3. 页面滚动条&按键执行事件

    判断页面滚动条 $(window).bind('scroll', function () { //算出鼠标移动到顶部的高度. var scrollt = document.documentElemen ...

  4. 程序员必备技能:代码审查 (Google牛人谈Code Review)

    在上一篇博客里我暗示自己将不在为Google工作. 我还没有决定好去哪儿-有几个非常不错的工作机会让我选择.鉴于这段时间内我不受雇于任何公司,我想我可以写点和专业相关的东西,这些东西很有趣,但是如果我 ...

  5. [C#]LockBits使用笔记

    昨天想基于一张图片做个手机锁屏来着,原图如下:主要是嫌白底太丑了,一开始是想画图工具直接油漆桶伺候,然而一浇上去就发现问题了,变成了这样:看来得手工处理一下把底色统一了,原图分辨率挺高的,SetPix ...

  6. Java8增强的Map集合

    Map集合简介 Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的vlaue,key和value都可以是任何引用类型的数据. M ...

  7. layui——上传图片,并实现放大预览

    一般上传文件后会返回文件的路径,然后存储到数据库,那么首先实现上传后的放大和删除功能 function uploadSmallPic() { var upload = layui.upload; up ...

  8. 【SSH网上商城项目实战07】Struts2和Json的整合

    转自:https://blog.csdn.net/eson_15/article/details/51332758 上一节我们完成了DataGrid显示jason数据,但是没有和后台联系在一起,只是单 ...

  9. K:汉诺塔问题

    相关介绍:  汉诺塔问题是一个通过隐式使用递归栈来进行实现的一个经典问题,该问题最早的发明人是法国数学家爱德华·卢卡斯.传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上 ...

  10. PoPo数据可视化周刊第一期

    PoPo数据可视化 聚焦于Web数据可视化领域, 发现前端可视化领域有意思的内容. 涵盖前端可视化领域最新资讯, 开源可视化库的发布更新消息, 可视化案例分析与讲解, 可视化技术文章, 可视化大神的日 ...