一,文件操作

(一),文件处理流程

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. Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系

    1.Lambda表达式与接口之间的关系 只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口.见如下代码 Thread t1 = new Thread(new Runnable() ...

  2. ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字

    昨天工作中遇到这个问题: 有一个这样的字符串expression变量,里面可能存储的值类似于以下[Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1] [300,1 ...

  3. XPath定位时,使用文本的方法小技巧。

    1)//td[text()= "{0}" ]  #这是一种非常常用的定位方法,具体例子使用如下: __keyboard = '//td[text()= "{0}" ...

  4. webRTC中音频相关的netEQ(一):概述

    上篇文章(语音通信中终端上的时延(latency)及减小方法)说从本篇开始会切入webRTC中的netEQ主题,netEQ是webRTC中音频技术方面的两大核心技术之一(另一核心技术是音频的前后处理, ...

  5. SQL SERVER2008 数据库日志文件的收缩方法

    最近公司的数据库随着业务量的增多,日志文件巨大(超过300G),造成磁盘空间不够用,进而后来的访问数据库请求无法访问. 网上类似的方法也很多,但不可行,如下是我实践过,可行的,将日志文件收缩至任意指定 ...

  6. 将golang中变量重置为零的reflect方法

    下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的: type student struct { Age int `json:"age,omitempty"` Name ...

  7. excle 填充单元格内容到相同长度

    =CONCATENATE(REPT("0",4-LEN(H1)),H1)     

  8. laravel-admin安装时执行php arisan admin:install 命令时报SQLSTATE[42000]: Syntax error or acce ss violation: 1071 Specified key was too long; max key length is 1000 bytes

    问题根源 MySql支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会出现插入异常.三个字节UTF-8最大能编码的Unicode字符是0xffff,即Unicode中的基本多文种平面( ...

  9. React开发环境搭建(react,babel,webpack webpack-dev-server)

    最终效果: 配置webpack 自动编译脚本, 内容更改后浏览器页面自动刷新,提高效率. 主要靠webpack 的watch 功能. npm 全局安装的包: webpack webpack-cli w ...

  10. keil_v5生成.bin文件方法

    按ALT+F7,打开如下对话框 如上图,选择 After Build/ Rebuild下的Run#1,输入: C:/keil_v5/ARM/ARMCC/bin/fromelf.exe -bin -o ...