Python笔记13:文件操作三件套:read,write,seek

主要内容:

  • 小目标:掌握文件基本操作
  • 主要内容:

文件基本操作;

文件读写;

编码格式;

如果看完这篇文章,你还是弄不明白文件; 你来找我,我保证不打你,我给你发100的大红包。

先来看下文件:

  • 文件种类很多,txt,csv,excel等
  • 不同文件可以使用不同模块去进行操作

本文主要介绍文本文件操作。

1.文件操作基础

  • 来看下基本操作:打开,读写,关闭 代码实现:
#window下定义文件,使用r字符串
fpath = r'E:\test.txt'
#open函数打开文件,返回文件对象
f = open(fpath)
#read方法,将文件读完
lines = f.read()
print(lines)
f.close()

结果,文件内容:

this
is
test

看似简单,但是里面有很多知识点,我们来看下。

2. 文件打开

几个问题:

1. 以什么方式打开

2. 以什么编码格式打开

3. 打开会有什么结果

2.1 打开文件:open函数详解

open函数定义:

open(
    file,mode='r', buffering=-1, encoding=None,
    errors=None,newline=None,closefd=True,opener=None,
)

主要参数:



2.2 mode详解



组合方式参数说明:



  • 二进制方式:'wb','rb','wb+'...;如上面操作类,需要加b选项

2.3 写入文件,发生了什么

  • 使用w方式打开文件并写入汉字:测试
#window下定义文件,使用r字符串
fpath = r'E:\t1.txt'
#open函数打开文件,返回文件对象
wds = '测试'
f = open(fpath, 'w')
f.write(wds)
print(f)
f.close()

结果:

_io.TextIOWrapper name='E:\\t1.txt' mode='w' encoding='cp936'

结果中可以看到:

文件路径:name

文件权限:w

文件编码格式:cp936,window下默认编码格式,linux下一般为utf-8

  • 写入文件内容是什么?

1. '测试'的编码格式为unicode,这个编码不能直接写入到f文件;

2. f.write写入时候,将wds进行编码,编码格式为'cp936';

3. 编码完成之后,再写入文件;

4. 文件写有缓存,写入数据只是到了缓存中;什么时候同步到磁盘?

5. 情况1:只有缓存中的数据到了一定数量同步一次;

6. 情况2:调用flush方法强制写; 情况3:调用close方法关闭文件;

2.4 编码格式问题

  • 读取上一步写入的文件
#window下定义文件,使用r字符串
fpath = r'E:\t1.txt'
#open函数打开文件,只读,编码格式为cp936
f = open(fpath)
print(f.read())
f.close()

结果:测试

  • 使用utf-8编码格式打开
#window下定义文件,使用r字符串
fpath = r'E:\t1.txt'
#open函数打开文件,只读,编码格式为utf-8
f = open(fpath, encoding='utf-8')
print(f.read())
f.close()

结果报错:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

纠正:使用文件对应的编码格式打开,window下cp936与gbk等通用;

遇到这种问题:打开文件编码格式与文件自身编码格式不匹配。

3. 文件读取方式

方法说明:



3.1 遍历文件

  • 方式1 :for 循环遍历,推荐这种方式:
#window下定义文件,使用r字符串
fpath = r'E:\test.txt'
#open函数打开文件,返回文件对象
f = open(fpath)
#逐行遍历文件
for line in f:
    print(line, end='')
f.close()
  • 方式2:先将文件全部读出,然后逐行遍历
#window下定义文件,使用r字符串
fpath = r'E:\test.txt'
#open函数打开文件,返回文件对象
f = open(fpath)
for line in f.readlines():
    print(line, end='')
f.close()

3.2 如何理解:f.readline(size=-1, /)

  • 如果一行数据长度大于size,读取size个返回
  • 如果一行数据长度小于size,读取行尾返回
fpath = r'E:\test.txt'
f = open(fpath)
#读取3个
print(f.readline(3))
f.close()
f = open(fpath)
#读取10个
print(f.readline(10))
f.close()

结果:

thi
this

3.3 文件写入

  • f.write(text, /):写入text,返回写入长度
  • f.writelines(lines, /):一次写入多行
  • f.flush():强制将缓存写入磁盘
  • 文件换行:'\n' 示例:
fpath = r'E:\t2.txt'
#open函数打开文件,返回文件对象
wds = '测试'
f = open(fpath, 'w')
f.write(wds)
#换行
f.write('\n')
#写入多行
f.writelines([wds+'\n']*2)
f.close()

结果:

测试
测试
测试

4. seek操作

一个问题:文件读取之后,如何再次重新读取?

  • 方式1:关闭文件,再次读取
  • 方式2:使用seek操作
  • f.seek(cookie, whence=0, /):改变文件读写位置,
  • cookie为偏移量
  • whence为指定位置

whence说明0文件起始位置1文件当前位置,window只支持cookie=02文件结尾,window只支持cookie=0

读取为例:

fpath = r'C:\Users\hyg\Desktop\data\test.txt'
f = open(fpath)
#读取3个
line = f.read(3)
print(line)
#将读取位置设文件开头,向后偏移一个字节
f.seek(1,0)
line = f.read(3)
print(line)
#将读取位置设置到文件结尾
f.seek(0, 2)
line = f.read(3)
print(line)

结果:

thi
his

总结: 文件操作注意点:

  • 打开方式,尤其适用w方式,注意文件会被清空
  • 读写二进制文件,需要使用'rb'或者'wb'方式
  • 读取文件推荐使用for遍历
  • 文件写入注意换行使用'\n'

相关文章

oeasy教您玩转python - 9 - # 换行字符

换行字符回忆上次内容数制可以转化bin(n)可以把数字转化为 2进制hex(n)可以把数字转化为 16进制int(n)可以把数字转化为 10进制编码和解码可以转化encode 编码decode 解码A...

如何在python字符串输出中带换行符

之前写了一个采集代码,采集到的20条内容需要邮件发送出去。但是不知道为什么当时就是解决不了换行符的问题,因为解决不了的话发出去的邮件就是一大坨,没有可读性。今天重新学习的时候突然间就觉得这个东西很简单...

Python中print函数使用方法汇总,涨知识了

Print在日常的程序编写和调试中,使用的比较多,下面给大家详细分析下print不为人知的一些功能,比如print可以打印指定颜色的字体,可以将指定的内容打印输出到文件中去等。Print的完整语法格式...

「oeasy」python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生

换行字符回忆上次内容struct包可以让我们使用封包格式把数字封包到字节里pack函数负责封包unpack函数负责解封我们通过封到不同的字节状态遍历了一次ascii码还是有那片黑色的区域好像是一片黑暗...

「零基础学Python」Python中转义字符如何使用的?

一、什么是转义字符?√就是反斜杆+想要实现的转义功能首字母,表达特殊含义。二、为什么需要转义字符?√当字符串中包含换行、回车、水平制表符或退格等无法直接表示的特殊字符时,也可以使用转义字符当字符串中包...

python代码是如何执行的? python代码运行按哪个键

解释运行程序 回忆上次内容py 文件的程序是按照顺序一行行挨排解释执行的我们可以 python3 -m pdb hello.py 来对程序调试调试的目的是去除 bug别害怕 bugbug 会有提示我们...