Python之路Python文件操作

一、文件的操作

文件句柄 = open('文件路径+文件名', '模式')

例子

f = open("test.txt","r",encoding = “utf-8”)

分析:这里由于python文件和test.txt文件在同一文件夹里,不需要写test的绝对路径

如果要写绝对路径可以这样写

f = open(file = "d:/python/test.txt","r",encoding = “utf-8”)

文件打开模式有以下几种模式

1、文本文件的打开模式

“r” ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

“w”, 只写模式【不可读;不存在则创建;存在则清空内容】

"a",只追加写模式【不可读;不存在则创建;存在则只追加内容】

就是以二进制的方式打开文件,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

"+" 表示可以同时读写某个文件

"r+",读写【可读,可写】

"w+",写读【可读,可写】

"a+",写读【可读,可写】

2、readable()、writable()

readable()判断文件是否可读,返回True或者False,

writable()判断文件是否可写,返回True或者False,

例子

f.readable()

f.writable()

3、read()、readline() 、readlines()

f.read() #读取所有内容,光标移动到文件末尾

字符串的形式返回结果,read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止

f.readline() #读取一行内容,光标移动到第二行首部

以字符串的形式返回结果

f.readlines() #读取每一行内容,存放于列表中

读取文本所有内容,将每一行作为一个列表的元素,并且以列表的格式返回结果,但读取大文件会比较占内存。

4、write()、writelines( )

write()要写入字符串

writelines()既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件。 注意必须传入的是字符序列,不能是数字序列。

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

  

5、f.close() #关闭文件f.closed()#查看文件是否关闭

用open方法打开文件后,必须用f.close()关闭文件

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

f.closed()#查看文件是否关闭,返回True或者False

6、with open as f打开方法

这种打开文件的方式不用写f.closed关闭文件

例子

with open('/path/to/file', 'r') as f:
with open("test.txt","r",encoding = “utf-8”) as f:

7、 对于非文本文件,我们只能使用b模式

非文本文件的打开模式,只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式,b模式可以跨平台使用)

"rb"

"wb"

"ab"

f = open("test.py","rb")

分析:注意这里不能在加,encoding = “utf-8”,因为这里是以二进制的方式打开,不需要再设置打开的编码方式

例子

f = open("test.py","rb")
data = f.read()
print(data)

  

test.py文件内容:

输出

b'"111"\r\n"2222"\r\n"3333"\r\n\xe4\xbd\xa0\xe5\xa5\xbd'

分析:这里的\r\n是Windows平台的换行,以b开头代表输出的是字节形式

这里的\xe4\xbd\xa0\xe5\xa5\xbd'代表汉字

f = open("test.py","rb")
data = f.read()
print(data.decode("utf-8"))

  

输出结果

""
""
""
你好

  

分析:这里在test.py文件存储时用的是utf-8存储的,在打印输出的时候以"utf-8"进行解码即可输出结果。

以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

例子2

f = open("test11.py","wb")f.write("111\n")

f.close()

  

输出结果:出错,提示这里需要字节,而不是字符串形式,这里写入必须以字节形式写入

可改为

f = open("test11.py","wb")
f.write(bytes("111\n",encoding="utf-8"))
f.close()

  

分析:这里就可以把字符串“111\n”写入文件了,这里bytes()一定要指定一个编码。

或者直接对字符串进行编码,不用bytes()方法

f = open("test11.py","wb")
f.write("222\n".encode("utf-8"))
f.close()

  

8、f.encoding

取文件打开的编码

例子

f = open("test11.py","w",encoding="gbk")
f.write("222\n")
f.close()
print(f.encoding)

  

输出

gbk

  

分析:这里取的是文件打开的编码,即open语句里的编码,与源文件实际的编码无关。

9、f.flush() 、f.tell()

f.flush() 立刻将文件内容从内存刷到硬盘,这里需要用命令提示行操作,在pycharm里会直接将写入内容写入硬盘,不需要flush()

f.tell()获取当前光标所在的位置

10、文件内光标移动

read(3):

a、文件打开方式为文本模式时,代表读取3个字符

b、文件打开方式为b模式时,代表读取3个字节

read()默认读取整个文件

其余的文件内光标移动都是以字节为单位如seek,tell,truncate

例子

test.txt文件内容

f = open("test.txt","rb")
data = f.read(6)
f.close()
print(data)

  

输出结果

b'111\r\n2'

分析:这里的111算3个字节,\r\n算2个字节,2算1个字节,这里是b模式,以字节进行计算,这里不能指定编码即不能写encoding = "xx",否则会报错

例子2

文件内容与上面相同

f = open("test.txt","r+",encoding="utf-8")
data = f.read(6)
f.close()
print(data)

  

输出结果

111
22

  

分析:这是文本模式,这里的111算3个字符,换行符\r\n算一个字符,22算2个字符,共计6个字符。

11、seek()

seek()移动文件光标到到指定位置。

seek()语法

  f.seek(offset[, whence])

offset即移动多少个字节数,whence有0,1,2三种模式,0 代表文件开始算, 1 代表当前位置开始算, 2 代表文件末尾开始算,默认是0。其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的,Widnows 系统下的换行代表2个字节大小(\r\n)。

例子

test.txt文件内容

f = open("test.txt","r+",encoding="utf-8")
f.seek(3,0)
data = f.read()
f.close()
print(data)

  

输出结果

222
333
你好
444
aaa
bbb
ccc
555

  

例子2

文件内容与上面相同

f = open("test.txt","rb")
f.seek(5)
f.seek(11,1)
print(f.tell())

data = f.read()
f.close()
print(data)

  

输出结果

16

b'\xbd\xa0\xe5\xa5\xbd\r\n444\r\naaa\r\nbbb\r\nccc\r\n555'

  

分析

这里是以二进制打开的,111算3个字节,后面有个看不见的\r\n换行符,因此,seek(5)的位置就是第一行的最后

seek(11,1)是从当前位置继续移动光标,即222\r\n算5个字节,同理333\r\n算5个字节,“你好”(文本文件是utf-8编码的)算6个字节,因此这时只取“你”这个字的3个字节的第一个字节,光标移动到你的第一个字节之后,所以最后输出了\xbd\xa0\xe5\xa5\xbd共5个字节。

注意这里的光标操作要用seek()方法,直接用鼠标移动光标是无效的。

例子3

文件内容

f = open("test.txt","rb")
offs = -20
while True:
f.seek(offs,2)
data = f.readlines()
if len(data) > 1:
print("文件的最后一行是%s"%data[-1].decode("utf-8"))
breakf = open("test.txt","rb")
offs = -20
while True:
f.seek(offs,2)
data = f.readlines()
if len(data) > 1:
print("文件的最后一行是%s"%data[-1].decode("utf-8"))
break

  

这里目的是在不知道一行是多少字节的情况下输入最后一行

输出结果

文件的最后一行是2018-04-15 nicholas 学习了520分钟

分析:seek(-20,2)是从文件的最后开始计算的,必须以b模式进行。

12、 truncate()

truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。

例子

文件内容

f = open("test.txt","r+")
f.truncate(10)
data = f.read()
print(data)

  

输出结果

111

aaa

  

分析:这里是以字节进行计算的,111算3个字节,后面的换行符算2个字节,所以这里截取了111aaa和之后的2个换行符,共计10个字节。

Python之路Python文件操作的更多相关文章

  1. 小白的Python之路 day2 文件操作

    文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  2. python之路(五)-文件操作

    文件操作无非两个,即:读.写 python 2.x: 文件句柄 = file('文件路径', '模式') python3.x: 文件句柄 = open('文件路径', '模式') 打开文件的模式有: ...

  3. python之路---08 文件操作

    二十六.   文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写    f.close( ) f.f ...

  4. Python之路Python内置函数、zip()、max()、min()

    Python之路Python内置函数.zip().max().min() 一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算, ...

  5. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  6. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

  7. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  8. 自学Python之路-Python核心编程

    自学Python之路-Python核心编程 自学Python之路[第六回]:Python模块       6.1 自学Python6.1-模块简介    6.2 自学Python6.2-类.模块.包  ...

  9. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

随机推荐

  1. NMS:Non-maximum Suppression学习笔记

    非极大值抑制可看成一种局部极大值搜索,这里的局部极大值要比他的邻域值都要大.这里的邻域表示有两个参数:维度和n-邻域.维度有1-D,2-D,3-D...:至于n值根据具体情况设置.举个例子:一维的情况 ...

  2. js监听文本框内容变化

    js监听文本框内容变化 原理很简单,就是在外部先声明一个用来记录input值的变量,然后每0.1秒比较这个值与input的值,如果发生改变,则运行自己的代码,同时改变变量.从而实现对input值改变的 ...

  3. Cfree clion windows c语言 socket 网络编程

    server.c #include <stdio.h> #include <winsock2.h> #define SERVER_PORT 5208 //侦听端口 int ma ...

  4. python调用Go代码

    Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...

  5. Leetcode:Longest Substring Without Repeating Characters分析和实现

    题目大意是传入一条字符串,计算出这样的这样一条子字符串,要求子字符串是原字符串的连续的某一段,且子字符串内不包含两个或两个以上的重复字符.求符合上面条件的字符串中最长的那一条的长度. 首先注意到任意一 ...

  6. Linux GCC编译警告:Clock skew detected. 错误解决办法

    今天在虚拟机上用GCC编译一个程序的时候,出现了下面的错误: make: warning: Clock skew detected. Your build may be incomplete 试了ma ...

  7. suse配置dhcp服务器

    Suse  dhcp服务器安装在安装系统时勾选 Suse dhcp 默认配置文件 /etc/dhcpd.conf Suse dhcp 启动程序 /etc/init.d/dhcpd restart 配置 ...

  8. lucene 第二天

    Lucene/Solr   第二天 1. 课程计划 Lucene的Field Lucene的索引库维护 lucene的查询 a) Query子对象 b) QueryParser Lucene相关度排序 ...

  9. SpringMVC 课程第一天

    SpringMVC第一天   框架课程 1. 课程计划 第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合My ...

  10. 面试题:Java集合面试题(40道) 背1

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言 ...