Python3--文件读取、写入、追加及seek()方法的使用
一、读取、写入、追加
在读取、写入、追加数据之前,我们先导入os模块(我们对文件系统的访问大多通过os模块实现)再将我们要使用的绝对路径赋值给变量file_name、file_name2、file_name3.
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 9 17:11:06 2017
@author: goat
how to read\write file
"""
import os
base_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