一,文件操作

(一),文件处理流程

1,打开文件,获得文件句柄(open函数提供)并赋值

2,通过句柄对文件进行操作

3,关闭句柄

f = open('陈粒',encoding='utf-8')#open函数会先检索系统的编码gbk,文件存的是UTF-8编码,这样会出现乱码
data = f.read()
print(data)
f.close() f = open('XXX')#把XXX使用gbk编码保存在硬盘上,然后打开不会乱码
data = f.read()
print(data)
f.close()

(二),文件打开模式:

1,文件读操作,r只读

f = open('XXX','r')#XXX使用gbk编码
#data = f.read()
#print(data)
#输出文件内容
print(f.readable())#是否可读
#输出True
# print('第一行',f.readline(),end='')#readline,一次读取一行
# print('第二行',f.readline())#注意如果前面的f.read()读取了文件内容,则使用readline时,游标在文件尾,print不会显示内容
# print('第三行',f.readline())#如果文件没有第三行,则输出空,此时游标在文件尾
print('读取到列表',f.readlines())
#输出:读取到列表 ['1111\n', '2222\n', '\n']
f.close()

2,文件写操作,w只写

f = open('陈粒2','w',encoding='utf-8')#w写模式如果文件存在会把文件清空后再操作,文件不存在则新建
#f.read()#使用写模式打开,读会报错
#输出:io.UnsupportedOperation: not readable
f.write('11111\n')
f.write('22222\n')
f.write('333\n444\n555\n')
#f.writable()
f.writelines(['666\n',''])#写一个列表到文件
#f.writelines(['666\n','777',1])#写的内容必须是字符串,如果有数字存在会报错
#输出:TypeError: write() argument must be str, not int
f.close()

3,文件追加操作,a添加

f = open('陈粒2','a',encoding='utf-8')
f.write('\n写到文件最后')
f.close()

4,文件处理其它模式,r+,可读,可写

#r+模式,可读可写
f = open('陈粒2','r+',encoding='utf-8')
data = f.read()
print(data)
f.write('写测试')
f.close()

5,文件处理B(二进制)模式

1),open默认使用t方式(文本)打开文件,但如果文件是图片,视频等就不适用文本方式打开,需要改用b方式打开

2),二进制方式可以跨平台使用

3),使用举例:

#读二进制方式打开rb,需要解码
#f = open('test11.py', 'rb', encoding='utf-8') # b的方式不能指定编码
f = open('test11.py', 'rb')
data = f.read()
#'字符串'---------encode---------》bytes
#bytes---------decode---------》'字符串'
print(data.decode('utf-8')) #要想显示正常,需要decode,并指定解码类型
#写二进制方式打开wb,需要编码
f = open('test22.py','wb')
#f.write('11111\n') #报错,字符串以二进制形式写入,需要指定编码类型
f.write(bytes('11111\n',encoding='utf-8'))#使用bytes函数转换
f.write('杨戬'.encode('utf-8')) #使用字符串本身的encode方法转换
#追加二进制方式ab,在文件最后一个位置添加
f = open('test22.py','ab')
f.write('yangjian'.encode('utf-8'))

(三),文件处理的一些方法

写文件时游标的位置

#打开文件后,游标位于开头,故从开头开始写,覆盖原有内容
f = open('陈粒2','r+',encoding='utf-8')
test = '写在头部'
test1 = bytes(test,encoding='utf-8')
print(len(test1))
#输出:12 表示占用12个字节
test2 = '111\n222\n33'
print(len(test2))
#输出:10 表示占用10个字节
f.write(test)
#在陈粒2文件的开头部分 111\n222\n33 被'写在头部'占用,从字节上看差了2个
f.close()

readlines和writelines操作列表,每一行是一个列表元素

#文件修改,只剩第一行
src_f = open('xxx','r',encoding='gbk')
data = src_f.readlines()
src_f.close()
dst_f = open('xxx','w',encoding='gbk')
dst_f.writelines(data[0])
dst_f.close()

打开文件后,无需手动关闭,使用关键字with

with open('a.txt','w') as f:
f.write('1111\n') #使用with,复制文件内容到新文件
#src_f=open('xxx','r',encoding='gbk')
#dst_f=open('xxx','w',encoding='gbk')
with open('xxx','r',encoding='gbk') as src_f,\
open('xxx_new','w',encoding='gbk') as dst_f:
data=src_f.read()
dst_f.write(data)

flush,tell,newline=

f = open('a.txt','r',encoding='utf-8')
#f.close()
print(f.closed) #文件是否关闭
print(f.encoding)#文件打开的编码,跟源文件在硬盘上怎么存储没有关系
#f.flush()#从内存保存到硬盘,可以在终端内测试,打开文件写入内容,但是硬盘上文件并没有内容,然后使用flush保存再查看内容
print(f.tell())#当前游标所在位置 0
f.readline()#读取一行移动游标到行尾
print(f.tell())#当前游标所在位置
f.close() f = open('a.txt','r',encoding='utf-8',newline='')#使用newline关键字不让python自动处理\r,自动处理是python为跨平台准备的
print(f.readlines())
f.close()
#输出:['你好,你好\r\n']

注意:read(3)代表读取3个字符,其余的文件内游标移动都是以字节为单位,如seek,tell,truncate

#f.read()读取的是字符,不是字节
f = open('a.txt','r',encoding='utf-8')
print(f.read(3))
print(f.tell())#read以字符计算,但是tell仍以字节计算
f.close()
#输出
'''
你好,
9
'''

seek游标位置移动

f = open('a.txt','r',encoding='utf-8')
print(f.tell())
f.seek(3)
print(f.tell())
print(f.read())
f.close()
#输出
'''
0
3
好,你好
'''
#seek补充
#1模式,相对位置
f = open('seek.txt','rb')
print(f.tell())
f.seek(10)
print(f.tell())
f.seek(3)
print(f.tell()) #输出:3,默认从文件头开始计算
f.seek(5,1) #1模式,相对上一次位置移动,但是打开文件方式必须加b,二进制方式打开。二进制打开不能指定编码
print(f.tell()) #输出:8
f.close() #2模式,文件尾往回数
f = open('seek.txt','rb')
print(f.tell())
f.seek(-5,2) #2模式,从文件末尾开始seek,但是seek值必须是负数
print(f.tell())
print(f.read()) #输出b'\r\n123
f.close() #循环文件技巧
f = open('日志文件','rb')
for i in f: #使用f而不是f.readlines(),可以避免在内存中生成大列表
print(i)
f.close() #使用场景,日志文件很大,一般读取最后一行
f = open('日志文件','rb') for i in f:
offs = -3
while True:
f.seek(offs,2)
data = f.readlines()
if len(data) > 1: #如果倒数读取了一行多,打印,结束循环
print('最后一行%s'%(data[-1].decode('utf-8')))
break
offs *= 2 #如果还不到一行,增加offs继续试探
#输出:最后一行2016/12/30 sb 干了件sb事情

truncate文件截断,属于先读文件后写文件,一般r+打开

f = open('a.txt','r+',encoding='utf-8')
f.truncate(6)#从文件头开始保留6个字节,其余删除

【笔记】Python基础三:文件的更多相关文章

  1. Python 基础三 文件 函数

    今天回顾一下之前学的文件操作相关知识点,对于文件的操作,主要有一下几部分构成: 一.文件的基础知识 1.文件操作的基本流程 文件操作其实可以分成三大部分: 1.打开文件,获取文件句柄并赋予一个变量 2 ...

  2. Python基础_文件的的处理及异常处理

    今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数  open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...

  3. 七. Python基础(7)--文件的读写

    七. Python基础(7)--文件的读写 1 ● 文件读取的知识补充 f = open('file', encoding = 'utf-8') content1 = f.read() content ...

  4. python基础篇(文件操作)

    Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...

  5. python基础之文件读写

    python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...

  6. 第二篇:python基础之文件读写

    python基础之文件读写   python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使 ...

  7. Python 基础 三 反射

    Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...

  8. Python基础(三)——集合、有序 无序列表、函数、文件操作

    1.Set集合 class set(object): """ set() -> new empty set object set(iterable) -> n ...

  9. Python基础之文件处理、函数、内置函数 (三)

    内置函数 一 详细见python文档,请点击 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') 注:python中打开 ...

  10. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

随机推荐

  1. [蓝桥杯]PREV-19.历届试题_九宫重排

    题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1 ...

  2. python学习笔记八(集合)

    集合 set是一个无序的不重复元素序列. 用大括号或set()函数创建集合.注意:创建一个空集合用set(),不用{},{}用来创建空字典 basket = {'apple','orange','ap ...

  3. Ubuntn16.04.3安装Hadoop3.0+scale2.12+spark2.2

    Ubuntn16.04.3安装Hadoop3.0+scale2.12+spark2.2 对比参照此博文.bovenson 前言:因为安装的Hadoop.Scale是基于JAVA的应用程序,所以必须先安 ...

  4. SpringBoot与SpringCloud的版本对应详细版

    大版本对应: Spring Boot Spring Cloud 1.2.x Angel版本 1.3.x Brixton版本 1.4.x stripes Camden版本 1.5.x Dalston版本 ...

  5. qnx spi 学习笔记

    文档还在编辑中,目前排版很乱,边看边写..等写完了编辑 qnx spi 学习  --目前只是看了代码,学的不深入,有错误的地方请联系我 谢谢 spi init spi init应该是分为2条线,一条是 ...

  6. IC5141安装备忘

    X Error of failed request:  BadName (named color or font does not exist)   Major opcode of failed re ...

  7. Spring boot 的 properties 属性值配置 application.properties 与 自定义properties

    配置属性值application.properties 文件直接配置: com.ieen.super.name="MDD" 自定义properties文件配置:src/main/r ...

  8. C语言数据结构基础学习笔记——动态查找表

    动态查找表包括二叉排序树和二叉平衡树. 二叉排序树:也叫二叉搜索树,它或是一颗空树,或是具有以下性质的二叉树: ①若左子树不空,则左子树上所有结点的值均小于它的根结点的值: ②若右子树不空,则右子树上 ...

  9. 团队第五次 # scrum meeting

    github 本此会议项目由PM召开,召开时间为4-9日晚上9点 召开时长15分钟 任务表格 袁勤 负责协调前后端 https://github.com/buaa-2016/phyweb/issues ...

  10. Flask即插视图与tornado比较

    由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今 ...