python中文件定位语句_python成长之路第一篇(5)文件的基本操作

python是怎么操作文件的呢?我们一起来看一下,一般来说对文件的操作有这么几种读写追加

open函数

不同模式打开文件的完全列表:模式描述

r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。

r+打开一个文件用于读写。文件指针将会放在文件的开头。

rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

(1)打开文件foo = open("test","r") #open是关键字,test是文件的名称,r是打开的模式为只读

print(foo)

哦?返回的是什么东东,原来在打开文件后,foo的值等于一个迭代器,迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。

那怎么能够看到里面的内容呢?非常简单

(2)加载文件内容到内存

read()函数:foo = open("test","r")

foo = foo.read()

print(foo)

只需要foo 等于foo.read(),read函数的作用就是从一个打开的文件中读取一个字符串。

据说有人不喜欢read方式来读取文件!!这是为什呢呢?

因为:

read()的机制是将文件内容一股脑的读入内存,满足不了大家的需求

所以出现了readlines()一次性加载所有内容到内存,并按照行分割,合成列表

readlines()foo = open("test","r")

ss = foo.readlines()

print(ss)

["a\n", "bb\n", "ccc\n", "dddd\n", "eeeee"]

纳尼\n是毛毛啊,哦原来是换行符吓老子一跳,还有人说了 我就1M的内存读1G的文件,你不是要我命么,没关系python还有另外的方法来处理文件

readline()

每次仅读取一行数据,这样我们就可以for循环,处理到要处理的内容退出就好了

foo = open("test","r+")

ss = foo.readline()

dd = foo.readline()

print(ss+dd)

a

bb

(3)读取中文文件

有勤快的小同学就试了试,尼玛为啥中文文件就报错呢?其实呢,不是你写错的而是编码问题

①编码与解码

对于中文文件编码格式为gbk,所以在正常的情况下我们使用Pycharm进行调试时用的是uft-8的编码格式所以会报错

FqEvOkHiEGtk5Z2-NIVXT-69R9oa

我们知道我们现在一般接触三种编码格式分别是,gbk,utf-8,unicode

unicode:万国码Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

utf-8:UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言

GBK:是汉字编码标准之一中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订

那么他们之间的关系是什么样的呢,其实主需要记住一点就好,gbk,utf-8它的源是unicode,所以呢请看下图

FjIA74FREZyAL5d5E7-1dU0nngaF

decode是解码,encode是编码,也就是gbk想要转换成utf-8就需要先把gbk解码成unicode,然后unicode在编码成utf-8,我们来试一下

②python2.7和3.5正常输出中文的多种方法

这些方法主要目的都是为了把编码变成utf-8

python2.7:

方法1:在pycharm项目目录下用windows创建一个txt文件foo = open("ttt.txt","r")

ss = foo.read().decode("gbk")

print ss

二二

三三三

四四四四

五五五五五

六六六六六六

python3.5:

0.0是不是很郁闷他自己就可以不需要变换编码foo = open("ttt.txt","r")

ss = foo.read()

print (ss)

codecs函数重点来了:

不管是2.7还是3.5有一些特殊的情况无法输出中文字符则我们用到codecs这个函数

调用了codecs函数后:

其实呢方法很简单激素codecs这个函数也提供了open的方法,只需要codecs.open(‘文件名’,’打开模式’,’编码格式’)就好了。

注意:

使用pycharm切换2.7和3.5的时候可能出现混乱建议实际测试为准

(4)写入操作

python提供了这么多种打开方式,其实常用不没有几个r,r+,w,w+,a,a+我们一一来看①r+啥情况我前面的东西呢!!,额好吧全被替换掉了(推荐测试使用linu毕竟都是运行在linux中)

②w,汗以前的内容全被替换掉了,w+就不用测试了吧

③a哦原来追加到最后了为毛不换行!在前面加个\n试试

(5)删除

对于python来说没有提供直接删除文件内容的功能,所以只能使用语句来判断(反正我是不知道)

例子:反正是特别麻烦后面可以使用with 来优化一下我来解释一下,首先打开文件,for当i的内容等于ccc\n的情况下什么也不做,否则添加入列表,因为有换行符所以有\n,最后用w+打开文件把列表中的内容写入进去即可

FhTMnKOYjGOl-mq80LMrYwumVWPU

FlekE2mLdL_Egw6LG3kDnv0jEf0N1 foo = open("text","r") 2 aa = foo.readlines() 3 ccc = [] 4 for i in aa: 5     if i == "ccc\n": 6         continue 7     else: 8         ccc.append(i) 9 foo.close()10 11 foe= open("text","w+")12 for iss in ccc:13     foe.write(iss)14 foo.close()

删除

(6)file对象的属性

以下是和file对象相关的所有属性的列表:

例子:

fo = open("foo.txt", "r+")

print "文件名: ", fo.name

print "是否已关闭 : ", fo.closed

print "访问模式 : ", fo.mode

print "末尾是否强制加空格 : ", fo.softspace

结果:

文件名:  foo.txt

是否已关闭 :  False

访问模式 :  wb

末尾是否强制加空格 :  0

(7)文件定位

大家看到上面的打开方式的列表中有一个这样的词语‘指针’,那么这个指针就类似于光标定位的位置,所以在python中,就有这个定位的操作

原文件textaaa

bbb

ddd

fff

①打开文件,为什这里只输出了aaa bb呢,是因为read()后面加了个指针,指到了6,所以输出了这个,有人还问了那指到了6应该输出三个b啊现在怎么是两个呢,其实呢是因为你妹的还有个换行符占了个位置

FhTMnKOYjGOl-mq80LMrYwumVWPU

FlekE2mLdL_Egw6LG3kDnv0jEf0N1 foo = open("text","r+")2 aa = foo.read(6)3 print(aa)4 aaa 

5 bb

文件定位-打开文件② 查找当前位置tell()

foo = open("text","r+")

aa = foo.read(3)

ss = foo.tell()

print(aa,ss)

③把指针再次重新定位到文件开头

FhTMnKOYjGOl-mq80LMrYwumVWPU

FlekE2mLdL_Egw6LG3kDnv0jEf0N1 foo = open("text","r+")2 aa = foo.read(3)3 print(foo.tell())4 print(aa)5 foo.seek(0, 0)6 print(foo.tell())7 3 

8 aaa

9 0

重新定位指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值