Python3--文件读取、写入、追加及seek()方法的使用

网友投稿 373 2022-09-26

Python3--文件读取、写入、追加及seek()方法的使用

Python3--文件读取、写入、追加及seek()方法的使用

一、读取、写入、追加

在读取、写入、追加数据之前,我们先导入os模块(我们对文件系统的访问大多通过os模块实现)再将我们要使用的绝对路径赋值给变量file_name、file_name2、file_name3.

# -*- coding: utf-8 -*-"""Created on Wed Aug 9 17:11:06 2017@author: goathow to read\write file"""import osbase_dir = os.getcwd()#获取当前文件夹的绝对路径file_name = os.path.join(base_dir, 'data', 'my_infor.txt')#拼接当前目录和data文件夹和my_infor.txt文件file_name2 = os.path.join(base_dir, 'data', 'my_write.txt')file_name3 = os.path.join(base_dir, 'data', 'my_test.txt')

1.使用readlines()方法读取所有剩余行

my_open = open(file_name, 'r')# 若文件不存在,报错,若存在,读取my_infor = my_open.readlines()#readlines()方法读取所有剩余行,将他们作为一个字符串列表返回my_open.close()#close()关闭文件,结束访问print(my_infor)

#===========================================

输出结果如下:

['安徽财经大学\n', '应用统计\n', '大三\n', '19岁\n']

#===========================================

2.使用文件迭代器每次读取和显示一行

my_open = open(file_name, 'r')# 若文件不存在,报错,若存在,读取for eachline in my_open: print(eachline.strip())#使用文本迭代器,每次读取和显示一行#使用strip(rm)方法移除字符串头尾指定的字符#rm为需要删除的字符#当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')my_open.close()

#===========================================

输出结果如下:

安徽财经大学

应用统计

大三

19岁

#===========================================

3.写入数据

my_open = open(file_name2, 'w')#打开fie_name2路径下的my_write.txt文件,采用写入模式#若文件不存在,创建,若存在,清空并写入my_open.write('one\ntwo\n')#在文件中写入一个字符串my_open.write('three\n')my_open.close()##检查是否正确写入my_open = open(file_name2, 'r')#读取file_name2路径下的my_write.txt文件my_infor = my_open.readlines()my_open.close()print(my_infor)

#===========================================

输出结果如下:

['one\n', 'two\n', 'three\n']

#===========================================

4.追加数据

my_open = open(file_name, 'a')#打开fie_name路径下的my_infor.txt文件,采用追加模式#若文件不存在,创建,若存在,追加my_open.write('蚌埠\n')my_open.close()##检查是否正确追加my_open = open(file_name, 'r')#读取file_name路径下的my_write.txt文件my_infor = my_open.readlines()my_open.close()print(my_infor)

#===========================================

输出结果如下:

['安徽财经大学\n', '应用统计\n', '大三\n', '19岁\n', '蚌埠\n']

#===========================================

二、seek()方法使用

seek()方法使用案例

my_open = open(file_name3, 'w+')#打开fie_name3路径下的my_test.txt文件,以读写方式#若文件不存在,创建,若存在,覆盖#实际上我们的确没有这个文件print('position_1 : ', my_open.tell())#返回当前在文件中的位置my_open.write('line_1\n')print('position_2 : ', my_open.tell())my_open.write('line_2\n')print('position_3 : ', my_open.tell())try: my_open.seek(-len('line_2\n'), 1) '''seek()可以在文件中移动文件指针指针 从whence(0 代表文件开始 1 代表当前位置 2 代表文件末尾)偏移off字节 off为正往结束方向移动,为负往开始方向移动 这里表示从当前位置往开始方向移动8字节''' print('position_4 : ', my_open.tell()) read1 = my_open.readline() #从文件中读取并返回一行 print(read1, '\nposition_5 : ', my_open.tell()) my_open.seek(off = 0, whence = 0) #回到最开始 read2 = my_open.readline() print(read2, '\nposition_6 : ', my_open.tell())except IOError as e: print(e,'\n', '意为:对于非二进制的文本文件,不允许使用偏移定位。') print('position_4 : ', my_open.tell())my_open.close()

#===========================================

输出结果如下:

position_1 :  0

position_2 :  8

position_3 :  16

can't do nonzero cur-relative seeks

意为:对于非二进制的文本文件,不允许使用偏移定位。

position_4 :  16

#===========================================

为了解决这种情况,我们建立一个二进制文件

my_open = open(file_name3, 'wb+')#读写打开或建立一个二进制文件,允许读和写print('position_1 : ', my_open.tell())try: my_open.write('line_1\n') print('position_2 : ', my_open.tell()) my_open.write('line_2\n') print('position_3 : ', my_open.tell()) my_open.seek(-len('line_2\n'), 1) print('position_4 : ', my_open.tell()) read1 = my_open.readline() print(read1, '\nposition_5 : ', my_open.tell()) my_open.seek(off = 0, whence = 0) read2 = my_open.readline() print(read2, '\nposition_6 : ', my_open.tell())except TypeError as e: print(e, '\n', '意为:需要的是一个字节的对象,不是“str”')my_open.close()

#===========================================

输出结果如下:

position_1 :  0

a bytes-like object is required, not 'str'

意为:需要的是一个字节的对象,不是“str”

#===========================================

Python文件使用“wb+”方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入。

如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。所以写入的字符类型需为二进制格式,如:

f.write("hello".encode('ascii'))

写入的编码范围不为128以内,就不能使用ascii了

如:

fh.write("汉字".encode('UTF-8'))

my_open = open(file_name3, 'wb+')print('position_1 : ', my_open.tell())my_open.write('line_1\n'.encode('ascii'))print('position_2 : ', my_open.tell())my_open.write('line_2\n'.encode('ascii'))print('position_3 : ', my_open.tell())my_open.seek(-len('line_2\n'), 1)print('position_4 : ', my_open.tell())read1 = my_open.readline()print(read1, '\nposition_5 : ', my_open.tell())my_open.seek(0, 0)read2 = my_open.readline()print(read2, '\nposition_6 : ', my_open.tell())my_open.close()##检查是否正确写入my_open = open(file_name3, 'r')#读取file_name3路径下的my_test.txt文件my_infor = my_open.readlines()my_open.close()print(my_infor)

#===========================================

输出结果如下:

position_1 :  0

position_2 :  7

position_3 :  14

position_4 :  7

b'line_2\n'

position_5 :  14

b'line_1\n'

position_6 :  7

##检查是否正确写入

['line_1\n','line_2\n']

#===========================================

终于可以使用seek()方法了,现在我们打开my_test.txt,查看输出结果,如下图所示:

发现文件里并没有换行,这是因为:文本模式下打开文件写入时,换行用\n即可以了。在使用二进制模式打开文件,写入的时候,换行请使用\r\n

my_open = open(file_name3, 'wb+')print('position_1 : ', my_open.tell())my_open.write('line_1\r\n'.encode('ascii'))print('position_2 : ', my_open.tell())my_open.write('line_2\r\n'.encode('ascii'))print('position_3 : ', my_open.tell())my_open.seek(-len('line_2\r\n'), 1)print('position_4 : ', my_open.tell())read1 = my_open.readline()print(read1, '\nposition_5 : ', my_open.tell())my_open.seek(0, 0)read2 = my_open.readline()print(read2, '\nposition_6 : ', my_open.tell())my_open.close()##检查是否正确写入my_open = open(file_name3, 'r')#读取file_name3路径下的my_test.txt文件my_infor = my_open.readlines()my_open.close()print(my_infor)

#===========================================

输出结果如下:

position_1 :  0

position_2 :  8

position_3 :  16

position_4 :  8

b'line_2\r\n'

position_5 :  16

b'line_1\r\n'

position_6 :  8

##检查是否正确写入

['line_1\n','line_2\n']

#===========================================

打开my_test.txt,如下图所示:

好了,累死宝宝了,表示自己原理什么的完全不懂,如有错误请求提出!

参考文献:

文件使用二进制模式打开情况下的换行的方法

Python文件使用“wb”方式打开,写入内容

fopen与读写的标识r,r+,rb+,rt+,w+.....

python文件打开方式详解——a、a+、r+、w+区别

使用​​os​​​模块来获取当前文件的​​绝对路径​​和拼接路径

​​https://zhidao.baidu.com/question/360101661090517412.html?qbl=relate_question_1&word=python%CF%E0%B6%D4%C2%B7%BE%B6%CF%C2%D2%BB%BC%B6​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:多重共线性诊断与R语言实践
下一篇:Java特性 Lambda 表达式和函数式接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~