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,如下图所示:

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

参考文献:

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

http://blog.csdn.net/fdl19881/article/details/7327106

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

http://www.cnblogs.com/biyuting/p/5955750.html

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

http://blog.csdn.net/cyforce/article/details/6159989

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

http://blog.csdn.net/ztf312/article/details/47259805

使用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

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

  1. php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...

    VC++在TXT文件指定位置追加内容的方法 本文实例讲述了VC++操作文本文件的方法,实现在txt文件指定位置插入内容.对于VC++爱好者有一定的学习参考价值. 主要功能代码如下: void CGoT ...

  2. python逐行写入csv_python 实现一次性在文件中写入多行的方法

    python 实现一次性在文件中写入多行的方法 将要写入的内容 构造 进一个list 中,使用writelines()方法 一次性写入. file_w.writelines(list) file_w. ...

  3. C#实现DXF文件读取写入

    废话不多说直接上效果图.源码 使用netDXF读取 OpenFileDialog of = new OpenFileDialog();of.Filter = "(*.dxf)|*.dxf|( ...

  4. php怎么从文件中读取数据库连接,PHP连接 读取 写入mysql数据库的方法 附常用代码...

    MYSQL一般都是和PHP配套使用用来建设网站,这里提供PHP连接MySQL数据库以及读取写入数据库的方法,供大家参考使用: 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $my ...

  5. python3 文件读取和写入中文

    在 Python 中使用文件的关键函数是 open() 函数.(w3school) open() 函数有两个参数:文件名和模式. 有四种打开文件的不同方法(模式): "r" - 读 ...

  6. MATLAB读取写入文本数据最佳方法 | Best Method for Loading Saving Text Data Using MATLAB

    MATLAB读取文件有很多方法.然而笔者在过去进行数据处理中,由于函数太多,相互混杂,与C#,Python等语言相比,反而认为读取文本数据比较麻烦.C#和Python等高级语言中,对于大部分的文本数据 ...

  7. python 文件操作写入追加write

    ** python 文件操作写入write ** # 文件写入操作,w文件不存在创建,文件存在清空 f = open("D:/test.txt", "w", e ...

  8. C# FileStream类的文件流、文件读取写入操作

    文件流FileStream 位于命名空间System.IO下,主要用来操作文件流,与File类的读取写入相比File类读取文件时是一次性读取,在操作大型文件时容易导致内存飙升,FileStream类则 ...

  9. python文件读取写入元组_python文件和元组

    python文件操作 相较于java,Python里的文件操作简单了很多 python 获取当前文件所在的文件夹: os.path.dirname(__file__) 写了一个工具类,用来在当前文件夹 ...

最新文章

  1. php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程
  2. 前端工程师和设计师必读文章推荐【系列三十三】
  3. pandas中如何选取某几列_pandas 选取行和列数据的方法
  4. Redis添加主节点
  5. 第十三天-迭代器、三元表达、字典生成式、生成器、递归
  6. 教你如何利用EXCEL制作动态仪表盘
  7. 不止代码:友好城市(动态规划)
  8. tomcat学习笔记1
  9. 12. 星际争霸之php设计模式--模板模式
  10. mysql调试问题_mysql 数据库调试分析
  11. 27款经典的 CSS 框架分享
  12. 算法在身边——学习算法从妈妈的菜谱开始
  13. 普加项目管理甘特图使用--安装部署
  14. proposal中文翻译_proposal是什么意思_ proposal的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. 比 rm -rf /* 还骚的 Linux 19 个装 B 的命令!
  16. qq私聊顺序回复_QQ为什么难以替代
  17. Flash、EEPROM、SRAM的区别与理解
  18. #4258. 铃铛计数问题
  19. 【华为OD统一考试B卷 | 200分】服务器广播、需要广播的服务器数量( C++ Java JavaScript )
  20. 实验三 敏捷开发与XP实践 实验报告 20135232王玥

热门文章

  1. 机器学习(三十五)——Actor-Critic, Integrating Learning and Planning(1)
  2. python以缩进对齐的方式划分语句块_python以什么划分语句块
  3. RT-Flash imxrt 系列rt1052 rt1060量产神器宣传
  4. python 决策树 math库 c45算法
  5. Android Camera 流程学习记录(五)—— Camera.takePicture() 流程解析
  6. Linux内核实现多路镜像流量聚合和复制
  7. mysqlreport查看mysql性能
  8. Java内存原型分析:基本知识
  9. 比较第一与第二个字符串,是否有连续的5个字符相同.sql
  10. Spring Boot教程(7) – 直观地理解Spring容器