Python 文件操作(2)
上一篇学习了用内置函数 open() 来打开文件,并且用 f.close() 来关闭文件。
今天来学习对这个文件对象的其他操作:读、写、找到文件当前位置……
1.读取文件
三种方法:
- read([size]),方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止。该方法返回一个字符串对象。
- readline(),该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件。该方法返回一个字符串对象。
- readlines(),该方法读取整个文件所有行,保存在一个列表中,每行作为一个元素,但读取大文件会比较占内存。
1.1 read()方法
with open("G:\Python\secret.txt",'r') as f:
f = f.read()
print(f)
print(type(f))
初次看见姑卡正是去年这个时候,她和她一家人住在我小屋附近的一幢大房子内,是警官罕地的大女儿。
那时的姑卡梳着粗粗的辫子,穿着非洲大花的连身长裙,赤足不用面纱,也不将身体用布缠起来,常常在我的屋外呼叫着赶她的羊,声音清脆而活泼,俨然是一个快乐的小女孩。
后来她来跟我念书,我问她几岁,她说:“这个你得去问罕地,我们沙哈拉威女人是不知道自己几岁的。”她和她的兄妹都不称呼罕地父亲,他们直接叫他的名字。罕地告诉我姑卡十岁,同时反问我:“你大概也十几岁吧?姑卡跟你很合得来呢。”我无法回答他这个荒谬的问题,只好似笑非笑的望着他。
半年多过去了,我跟罕地全家已成了很好的朋友,几乎每天都在一起煮茶喝。有一天喝茶时,只有罕地和他的太太葛柏在房内。罕地突然说:“我女儿快要结婚了,请你有便时告诉她。”我咽下一口茶,很困难的问他:“你指姑卡吗?”他是:“是,过完拉麻丹再十日就结婚。”拉麻丹是回教的斋月,那时已快开始了。
<class 'str'>
1.2 readline()方法
f = open("G:\Python\secret.txt",'r')
line = f.readline()
print(line)
print(type(line))
初次看见姑卡正是去年这个时候,她和她一家人住在我小屋附近的一幢大房子内,是警官罕地的大女儿。
<class 'str'>
f.readline()
' 那时的姑卡梳着粗粗的辫子,穿着非洲大花的连身长裙,赤足不用面纱,也不将身体用布缠起来,常常在我的屋外呼叫着赶她的羊,声音清脆而活泼,俨然是一个快乐的小女孩。\n'
f.readline()
' 后来她来跟我念书,我问她几岁,她说:“这个你得去问罕地,我们沙哈拉威女人是不知道自己几岁的。”她和她的兄妹都不称呼罕地父亲,他们直接叫他的名字。罕地告诉我姑卡十岁,同时反问我:“你大概也十几岁吧?姑卡跟你很合得来呢。”我无法回答他这个荒谬的问题,只好似笑非笑的望着他。\n'
f.close()
1.3 readlines()方法
f = open('G:\Python\secret.txt','r')
lines = f.readlines()
print(lines)
type(lines)
[' 初次看见姑卡正是去年这个时候,她和她一家人住在我小屋附近的一幢大房子内,是警官罕地的大女儿。\n', ' 那时的姑卡梳着粗粗的辫子,穿着非洲大花的连身长裙,赤足不用面纱,也不将身体用布缠起来,常常在我的屋外呼叫着赶她的羊,声音清脆而活泼,俨然是一个快乐的小女孩。\n', ' 后来她来跟我念书,我问她几岁,她说:“这个你得去问罕地,我们沙哈拉威女人是不知道自己几岁的。”她和她的兄妹都不称呼罕地父亲,他们直接叫他的名字。罕地告诉我姑卡十岁,同时反问我:“你大概也十几岁吧?姑卡跟你很合得来呢。”我无法回答他这个荒谬的问题,只好似笑非笑的望着他。\n', ' 半年多过去了,我跟罕地全家已成了很好的朋友,几乎每天都在一起煮茶喝。有一天喝茶时,只有罕地和他的太太葛柏在房内。罕地突然说:“我女儿快要结婚了,请你有便时告诉她。”我咽下一口茶,很困难的问他:“你指姑卡吗?”他是:“是,过完拉麻丹再十日就结婚。”拉麻丹是回教的斋月,那时已快开始了。']
list
lines[0] #每一行可作为一个元素
' 初次看见姑卡正是去年这个时候,她和她一家人住在我小屋附近的一幢大房子内,是警官罕地的大女儿。\n'
lines[2]
' 后来她来跟我念书,我问她几岁,她说:“这个你得去问罕地,我们沙哈拉威女人是不知道自己几岁的。”她和她的兄妹都不称呼罕地父亲,他们直接叫他的名字。罕地告诉我姑卡十岁,同时反问我:“你大概也十几岁吧?姑卡跟你很合得来呢。”我无法回答他这个荒谬的问题,只好似笑非笑的望着他。\n'
(三毛写的,高中读的撒哈拉~,推荐哦)
记得关件
f.close()
2.写入操作
两种方法:
- write(),该方法将字符串(仅支持字符串)写入文件,返回的是写入的字符长度。
- writelines(),该方法将字符串或者是列表写入文件,
2.1write()方法
f = open('G:\Python\secret.txt')
f.write('test_1')
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-10-53f5452c8e4b> in <module>()
1 f = open('G:\Python\secret.txt')
----> 2 f.write('test_1')
UnsupportedOperation: not writable
记住,一定要记得修改mode参数
f = open('G:\Python\secret.txt','w')
f.write('test_2')
6
f.close()
with open('G:\Python\secret.txt','r') as f:
print(f.read())
test_2
在'w'模式下,写入操作会将所有旧的内容都清除掉,然后写入新的东西。OR,如果没有这个文件,python将创建新文件,来把这个新来的宝宝安置在新的文件里。
2.2 writelines()方法
注意:
- 如果以list形式写入txt文件,可以写入多行;如果以str形式写入txt文件,则只能写入一行。
- 在list中的每个元素末尾,必须加上’\n’的换行符(显示输入),否则list中的各元素将写入到一行
with open('G:\Python\secret.txt','w') as f:
f.writelines(['test_2','test_3'])
with open('G:\Python\secret.txt','r') as f:
print(f.read())
test_2test_3
with open('G:\Python\secret.txt','w') as f:
f.writelines(['test_4\n','test_5\n'])
with open('G:\Python\secret.txt','r') as f:
print(f.read())
test_4
test_5
3.文件定位方法
3.1 tell()方法
当你在处理文件时,你想知道你现在在文件里的位置,可以用tell()实现。
f = open('G:\Python\secret2.txt', 'r')
content = f.read()
print('文件内容为:\n',content)
position = f.tell()
print('现在在文件的位置是:', position)
文件内容为:
BOSS is a little cat of mine. It was so cute and lovely.
I miss you.
My lovely cat.
现在在文件的位置是: 85
read()一下,就到了最后面的位置,我们现在在第85位哦。
现在我想把指针放到开头,要怎么办呢?
无问题,seek()帮你搞掂他。
3.2 seek()方法
seek(offset [,from])方法改变当前文件的位置。
Offset变量表示要移动的字节数(你想要移动多少步呀?)。
From变量指定开始移动字节的参考位置(你以谁为初始点去移动呀),默认值是0, 表示从文件开头作为起点。
- 如果from = 0,这意味着将文件的开头作为移动字节的参考位置。
- 如果from = 1,则使用当前的位置作为参考位置。
- 如果from = 2,那么该文件的末尾将作为参考位置。
f1 = open('G:\Python\secret2.txt', 'r')
f1.readline()
print('读取文件的一行后的位置:', f1.tell())
print('文件当前开始位置:', f1.seek(3, 0))
读取文件的一行后的位置: 58
文件当前开始位置: 3
f1.close()
但要注意,这里很容易出现报错。因为我们打开文件的方式,决定了我们能不能从特定的位置作为初始位置去定位我们想要的位置。
- 如果你想以文件开头作为初始位置(即from = 0),那么无论你以何种形式打开这个文件(r, w, b)都可以达到这个目的。
- 如果你想以当前位置或者文件末尾作为初始位置,那么你只能以b相关形式(二进制)去open这个文件。否则会报错。
f2 = open('G:\Python\secret2.txt', 'r')
f2.readline()
print('读取文件的一行后的位置:', f2.tell())
print('文件当前开始位置:', f2.seek(3, 1))
读取文件的一行后的位置: 58
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-18-35d5eacde913> in <module>()
2 f2.readline()
3 print('读取文件的一行后的位置:', f2.tell())
----> 4 print('文件当前开始位置:', f2.seek(3, 1))
UnsupportedOperation: can't do nonzero cur-relative seeks
Consequently, 请记住,文件的打开方式决定了你选择初始位置的权利。
所以,报错的时候不要惊讶!
最后,把打开的文件关上。
f2.close()
暂时记录到此为止
好了,又到吃零食的时候了,觅食觅食
欢迎指错。 Thanks!