Python学习之11.文件和素材

11.1 打开文件

  open函数用来打开文件,语法如下:

  open(name[.mode[.buffering]])

  open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式(mode)和缓冲(buffering)参数都是可选的。

  假设有一个名为whisper.txt的文件,存储路径为C:\text(或者在UNIX下的~/text),那么可以像下面这样打开文件:

f=open(r'C:\text\whisper.txt')

  如果文件不存在,则会报异常。



  如果open函数只带一个文件名参数,那么我们可以获得能读取文件内容的文件对象。如果要向文件内写入内容,则必须提供一个模式参数(如下表所示)来显式声明。


  明确指定读模式和什么模式参数都不用的效果是一样的。使用写模式可以向文件写入内容。

  '+'参数可以用到任何模式中,指明读和写都是允许的。比如'r+'能在打开一个文本文件用来读写时使用。

  'b'模式改变处理文件的方法。一般来说,Python假定处理的是文本文件(包含字符).通常这样做不会有任何问题,但如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或者图像,那么应该在模式参数中增加'b',例如参数'rb'可以用来读取一个二进制文件。



  open函数的第3个参数(可选)控制着文件的缓冲。如果参数是0(或者是False),I/O就是无缓冲的(所有的读写都直接针对硬盘);如果是1(或者是True),I/O就是有缓冲的(意味着Python使用内存来代替硬盘,让程序更快,只有使用flush或者clsoe时才会更新硬盘上的数据);大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认的缓存区大小。

11.2 基本文件方法

  文件(或流)最重要的能力是提供或者接受数据。如果有一个名为f的类文件对象,那么久可以用f.write方法和f.read方法(以字符串形式)写入和读取数据。

  每次调用f.write(string)时,所提供的参数string会被追加到文件中已存在部分的后面。

f=open(r'C:\text\whisper.txt','w')
f.write('Hello,')
f.write('World!')
f.close()

在完成了对一个文件的操作时,调用close关闭文件对象。

  读取更简单,只要记得告诉流要读多少字符(字节)即可。如下所示:

f=open(r'C:\text\whisper.txt','r')  //或者f=open(r'C:\text\whisper.txt')
f.read(4)
'Hell'
f.read()
'o,World!'

  首先指定了要读取的字符数"4",然后读取了剩下的文件。注意,在调用open读文件时可以省略模式说明,因为'r'是默认的。

  除了读取单个字符外,还可以使用file.readline读取单独的一行(从当前位置开始直到一个换行符出现,也读取这个换行符)。不使用任何参数时读取一行并返回,或者使用一个非负的整数作为readline参数可以读取该行的最大值。readlines方法可以读取一个文件中的所有行并将其作为列表返回。假如有如下文件:

##demo.txt
Hello,World!
It is a demo!

f=open(r'C:\text\demo.txt')
f.readline()  //返回'Hello,World!\n'

f=open(r'C:\text\demo.txt')
f.readline(100)  //返回'Hello,World!'(第一行100个字符,不足则返回第一行)

f=open(r'C:\text\demo.txt')
f.readlines()  //返回['Hello,World!\n', 'It is a demo!']

  writelines方法和readlines方法相反:传给它一个字符串的列表(实际上是任何序列或者可迭代的对象都行),它会把所有的字符串写入文件(或流)。注意,程序不能增加新行,需要自己添加。没有writeline方法,因为能使用write。
  应该牢记使用close方法关闭文件。通常来说,一个文件对象在退出程序后(也可能在退出前)自动关闭,尽管是否关闭文件不是很重要,但关闭文件是没有什么害处的,可以避免在某些操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。

  写入过的文件总是应该关闭,是因为Python可能会缓存写入的文件,入过程序崩溃了,那么数据根本不会被写入文件。为了安全起见,要在使用完文件后关闭。

  如果想确保文件被关闭了,那么应该使用try/finally语句,并且在finally子句中调用close方法。

#Open your file here
try:
   # Write data to your file
finally:
   file.close()

11.3 对文件内容进行迭代

  对文件内容进行迭代以及重复执行一些操作,是最常见的文件操作之一。定义如下函数:

def process(string):
    print 'Processing:',string

  最常见的对文件内容进行迭代的方法是在while循环中使用read方法。例如,对每个字符(字节)进行循环,可以用如下方法实现:

f=open(r'D:\workplace\python\demo.txgt')
char=f.read(1)
while char:
    process(char)
    char=f.read(1)
f.close() 

或者如下所示:

f=open(r'D:\workplace\python\demo.txt')
while True:
    char=f.read(1)
    if not char:
        break
f.close()

  当处理文件时,经常会对文件的行进行迭代而不是单个字符。处理行使用的方法和处理字符一样,即使用readline方法:

f=open(r'D:\workplace\python\demo.txt')
while True:
    line=f.readline()
    if not line:
        break
f.close()

  如果文件不是很大,可以说使用read方法一次读取整个文件(把整个文件当做一个字符串来读取),或者使用readlines方法(把文件读入一个字符串列表,在列表中每个字符串就是一行)。可以像下面这样做:

f=open(r'D:\workplace\python\demo.txt')
for char in f.read():
    process(char)
f.close()

或者:

f=open(r'D:\workplace\python\demo.txt')
for line in f.readlines():
    process(line)
f.close()

  在需要对一个非常大的文件进行迭代行的操作时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法来替代。当然,在Python中如果能使用for循环,那么它就是首选。下面使用fileiinput来对文件进行迭代:

import fileinput
for line in fileinput.input(r'D:\workplace\python\demo.txt')
f.close()

  在Python的近几个版本中(从2.2开始),文件对象是可迭代的,这就意味着可以直接在for循环中使用它们,从而对它们进行迭代:

f=open(r'D:\workplace\python\demo.txt')
for line in f:
    process(line)
f.close()

  注意sys.stdin是可迭代的,就像其他文件对象。因此如果想要迭代标准输入中的所有行,可以按如下形式使用sys.stdin:

import sys
for line in sys.stdin:
    process(line)

  可以对文件迭代器执行和普通迭代器相同的操作。比如将它们转换为字符串列表(使用list(open(filename))),这样所达到的效果和使用readlines一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容