资讯专栏INFORMATION COLUMN

Python基础之(六)文件

wuyangnju / 2682人阅读

摘要:它则是以行为单位返回字符串,也就是每次读一行,依次循环,如果不限定,直到最后一个返回的是空字符串,意味着到文件末尾了。

读文件

在某个文件夹下面建立了一个文件,名曰:130.txt,并且在里面输入了如下内容:

learn python
http://qiwsir.github.io
qiwsir@gmail.com
f = open("123.txt") #打开已经存在的文件,此文件在当前目录,若在其他目录使用绝对路径
for line in f:
    print line, #Python 3: print(line, end="")

learn python
http://qiwsir.github.io
liuguoquan@gmail.com

紧接着做下面的操作:

>>> for line2 in f:     #在前面通过for循环读取了文件内容之后,再次读取,
...     print line2         #然后打印,结果就什么也显示,这是什么问题?
...
>>>

这不是什么错误,是因为前一次已经读取了文件内容,并且到了文件的末尾了。再重复操作,就是从末尾开始继续读了。当然显示不了什么东西,但是Python并不认为这是错误。

在这里,如果要再次读取,那就从新f = open("130.txt")

创建文件
f = open("1234.txt","w") #创建文件
f.write("hello") #向文件写入内容
f.close() #关闭文件流

创建文件,我们同样是用open()这个函数,但是多了个"w",这是在告诉Python用什么样的模式打开文件。也就是说,用open()操作文件,可以有不同的模式。看下表:

模式 描述
r 以读方式打开文件,可读取文件信息。
w 以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容
a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建
r+ 以读写方式打开文件,可对文件进行读和写操作。
w+ 消除文件内容,然后以读写方式打开文件。
a+ 以读写方式打开文件,并把文件指针移到文件尾。
b 以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

从表中不难看出,不同模式下打开文件,可以进行相关的读写。那么,如果什么模式都不写,像前面那样呢?那样就是默认为r模式,只读的方式打开文件。

使用with

使用with实现安全的关闭文件,不用close操作了

>>> with open("130.txt","a") as f:
...     f.write("
This is about "with...as..."")
...
>>> with open("130.txt","r") as f:
...     print f.read()
...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
hello

This is about "with...as..."
>>>
文件状态
import os
file_stat = os.stat("123.txt")
print file_stat

posix.stat_result(st_mode=33188, st_ino=13575445, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=57,
st_atime=1470988267,
st_mtime=1470988267,
st_ctime=1470988267) #文件创建时间
read/readLine/readLines

read:如果指定了参数size,就按照该指定长度从文件中读取内容,否则,就读取全文。被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用,比较快捷;“成也萧何败萧何”,也是因为这点,如果文件内容太多了,内存会吃不消的。文档中已经提醒注意在“non-blocking”模式下的问题,关于这个问题,不是本节的重点,暂时不讨论。

readline:那个可选参数size的含义同上。它则是以行为单位返回字符串,也就是每次读一行,依次循环,如果不限定size,直到最后一个返回的是空字符串,意味着到文件末尾了(EOF)。

readlines:size同上。它返回的是以行为单位的列表,即相当于先执行readline(),得到每一行,然后把这一行的字符串作为列表中的元素塞到一个列表中,最后将此列表返回。

有这样一个文档,you.md,其内容和基本格式如下:

    You Raise Me Up
    When I am down and, oh my soul, so weary;
    When troubles come and my heart burdened be;
    Then, I am still and wait here in the silence,
    Until you come and sit awhile with me.
    You raise me up, so I can stand on mountains;
    You raise me up, to walk on stormy seas;
    I am strong, when I am on your shoulders;
    You raise me up: To more than I can be.

分别用上述三种函数读取这个文件。

>>> f = open("you.md")
>>> content = f.read()
>>> content #结果为字符串
"You Raise Me Up
When I am down and, oh my soul, so weary;
When troubles come and my heart burdened be;
Then, I am still and wait here in the silence,
Until you come and sit awhile with me.
You raise me up, so I can stand on mountains;
You raise me up, to walk on stormy seas;
I am strong, when I am on your shoulders;
You raise me up: To more than I can be.
"
>>> f.close()
>>> print content
>>> f = open("you.md")
>>> f.readline()
"You Raise Me Up
"
>>> f.readline()
"When I am down and, oh my soul, so weary;
"
>>> f.readline()
"When troubles come and my heart burdened be;
"
>>> f.close()

f = open("you.md")
while True:
   line = f.readline()
   if not line:         #到EOF,返回空字符串,则终止循环
       break
   print line ,         #Python 3: print(line, end="")

f.close()                #别忘记关闭文件
>>> f = open("you.md")
>>> content = f.readlines()
>>> content #结果为列表
["You Raise Me Up
", "When I am down and, oh my soul, so weary;
", "When troubles come and my heart burdened be;
", "Then, I am still and wait here in the silence,
", "Until you come and sit awhile with me.
", "You raise me up, so I can stand on mountains;
", "You raise me up, to walk on stormy seas;
", "I am strong, when I am on your shoulders;
", "You raise me up: To more than I can be.
"]

>>> for line in content:
...     print line ,         #Python 3: print(line, end="")
>>> f.close
读很大的文件fileinput

如果文件太大,就不能用read()或者readlines()一次性将全部内容读入内存,可以使用while循环和readline()来完成这个任务。

此外,还有一个方法:fileinput模块

>>> import fileinput
>>> for line in fileinput.input("you.md"):
...     print line ,        #Python 3: print(line, end="")
...
You Raise Me Up
When I am down and, oh my soul, so weary;
When troubles come and my heart burdened be;
Then, I am still and wait here in the silence,
Until you come and sit awhile with me.
You raise me up, so I can stand on mountains;
You raise me up, to walk on stormy seas;
I am strong, when I am on your shoulders;
You raise me up: To more than I can be.

还有一种方法,更为常用:

  >>> for line in f:
    ...     print line ,      #Python 3:  print(line, end="")
    ...
    You Raise Me Up
    When I am down and, oh my soul, so weary;
    When troubles come and my heart burdened be;
    Then, I am still and wait here in the silence,
    Until you come and sit awhile with me.
    You raise me up, so I can stand on mountains;
    You raise me up, to walk on stormy seas;
    I am strong, when I am on your shoulders;
    You raise me up: To more than I can be.

之所以能够如此,是因为文件是可迭代的对象,直接用for来迭代即可。

seek

这个函数的功能是让指针移动。

>>> f = open("you.md")
>>> f.readline()
    "You Raise Me Up
"
    >>> f.readline()
    "When I am down and, oh my soul, so weary;
"

>>> f.seek(0)  #回到文件的最开始位置
>>> f.readline()
    "You Raise Me Up
"

此时指针所在的位置,还可以用`tell()`来显示,如

>>> f.tell()
    17L

seek()还有别的参数,具体如下:

seek(...)
seek(offset[, whence]) -> None. Move to new file position.

whence的值:

默认值是0,表示从文件开头开始计算指针偏移的量(简称偏移量)。这是offset必须是大于等于0的整数。

是1时,表示从当前位置开始计算偏移量。offset如果是负数,表示从当前位置向前移动,整数表示向后移动。

是2时,表示相对文件末尾移动。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38206.html

相关文章

  • 基础如何学爬虫技术

    摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...

    KunMinX 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • python综合学习机器学习

    摘要:通过前面几节的学习,已经奠定了通往学习的基础,从这节开始,来学习机器学习。一什么是机器学习机器学习让机器从数据中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好,这就是机器学习。 通过前面几节的学习,已经奠定了通往AI学习的基础,从这节开始,来学习机器学习。 一、什么是机器学习 机器学习(MachineLearning):让机器从数据中学习,进而得到一...

    JackJiang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<