文件和材料

打开文件

open功能是用来打开文件,语法例如,下面的:

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

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

>>> f=open(r'D:\software(x86)\Python27\README.txt')

假设文件不存在。则出现错误:

>>> f=open(r'D:\software(x86)\Python27\README_unknown.txt')

Traceback (most recent call last):

File "<pyshell#5>", line 1, in <module>

f=open(r'D:\software(x86)\Python27\README_unknown.txt')

IOError: [Errno 2]

No such file or directory: 'D:\\software(x86)\\Python27\\README_unknown.txt'

文件模式

假设open函数仅仅带一个文件名称參数,则能够获取能读取文件内容的文件对象。

假设要向文件内写入内容,则必须提供一个模式參数来显式声明。

open函数中的模式參数仅仅有几个值。

值 描写叙述

‘r’ 读模式

‘w’ 写模式

‘a’ 追加模式

‘b’ 二进制模式(可加入到其它模式中使用)

‘+’ 读/写模式(可加入到其它模式中使用)

明白地指定读模式和什么模式參数都不用的效果是一样的。

使用写模式能够向文件写入内容。

‘+’參数能够用到其它不论什么模式中,指明读和写都是同意的。

比方’r+’能在打开一个文件文件用来读写时使用。

‘b’模式改变处理文件的方法。一般来说,python假定处理的是文本文件(包含字符)。通常这样做不会有什么问题,但假设处理的是一些其它类型的文件(二进制文件),比方声音剪辑或图像,那么应该在模式參数中添加’b’。

參数’rb’能够用来读取一个二进制文件。

注意:通过在模式參数中使用U參数可以在打开文件时使用通用的换行符支持模式,在这样的模式下,全部的换行符/字符串(\r\n,\r或\n)都被转换成\n,而不用考虑执行的平台。

缓冲

open函数的第3个參数控制着文件的缓冲。

假设參数是0或False,I/O就是无缓冲的(全部的读写操作直接针对硬盘);

假设參数是1或True,I/O就是有缓冲的(python使用内存取代硬盘。让程序更快,仅仅有flush或close时才会更新硬盘上的数据);

大于1的数字代表缓冲区的大小(单位是字节),

-1(或其它负数)代表使用默认的缓冲区大小。

基本文件方法

类文件对象是支持一些文件的方法的对象。更重要的是支持read方法或者write方法。或两者兼有。

读和写

文件(或流)最重要的能力是提供或者接受数据。

假设有一个名为f的类文件对象。就能够使用f.write方法和f.read方法(以字符串形式)写入和读取数据。

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

>>> f=open('D:\\software(x86)\\Python27\\temp\\temp.txt','w')

>>> f.write('Hello, ')

>>> f.write('signjing!')

>>> f.close()

在完毕了一个文件的操作时,调用close函数。

>>> f=open('D:\\software(x86)\\Python27\\temp\\temp.txt','r')

读取非常easy。仅仅要记得告诉要读取多少字符(字节)就可以。

>>> f.read()

'Hello, signjing!'

当不提供要读取的字符数时,read函数读取剩下的文件。

>>> f.read()

''

>>> f.close()

‘w’模式打开文件时即便没有对文件进行写入。也会先清空文件,这一点请注意。

管式输出

Unix的shell。能够使用管道在一个命令后面续写其它多个命令。

GNU bash在windows下也有。详情请了解cygwin。

在Mac OS X上。通过终端,能够使用shell文件。

$ cat somescript.py

#File: some script.py

import sys

text=sys.stdin.read()

word=text.split()

wordcount=len(word)

print "Wordcount: ",wordcount

print [w for w in word]

$ cat somescript.py | python somescript.py

Wordcount:  17

['#File:', 'some', 'script.py', 'import', 'sys', 'text=sys.stdin.read()', 'word=text.split()', 'wordcount=len(word)', 'print', '"Wordcount:', '",wordcount', 'print', '[w', 'for', 'w', 'in', 'word]']

读写行

通常来说,逐个字符读取文件是没有问题的。逐行读取也能够。

还能够使用file.readline读取单独的一行(从当前位置開始直到一个换行符出现。也读取这个换行符)。

不使用不论什么參数或者使用一个非负的整数作为readline能够读取的字符(或字节)的最大值。

readlines方法能够读取一个文件里的全部行并将其作为列表返回。

writelines方法和readlines相反:传给它一个字符串的列表(实际上不论什么序列或可迭代的对象都行)。它会把全部的字符串写入文件(或流)。

注意:程序不会添加新行,须要自己加入。没有writeline方法,由于能够使用write替代。

关闭文件

应该牢记使用close方法关闭文件。

通常来说,一个文件对象在退出程序后(也可能退出前)自己主动关闭,虽然十分关闭文件不是非常重要。但关闭文件是没有什么害处的,能够避免在某些操作系统或设置中进行没用的改动,这样做也会避免用完系统中所打开文件的配额。

写入过的文件总是应该关闭,由于python可能会缓存(处于效率的考虑而把数据暂时地存储在某处)写入的数据,假设程序由于某些原因崩溃了,那么数据根本就不会被写入文件。为了安全起见。要在使用完文件后关闭。

假设想确保文件被关闭了。应该使用try/finally语句。并在finally子句中调用close方法。

其实,有专门为这样的情况设计的语句,即with语句:

with open(“somefile.txt”) as somefile:

do_something(somefile)

with语句能够打开文件而且将其赋值到变量上。之后能够将数据写入语句体中的文件或运行其它操作。文件在语句结束后会被自己主动关闭,即使是因为异常引起的结束也是如此。

使用基本文件方法

read(n)

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> f.read(7)

'#File: '

>>> f.read(4)

'some'

>>> f.close()

read()

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> print f.read()

#File: some script.py

import sys

text=sys.stdin.read()

word=text.split()

wordcount=len(word)

print "Wordcount: ",wordcount

print [w for w in word]

>>> f.close()

readline()

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> for i in range(3):

...     print str(i) + ': ' + f.readline()

...

0: #File: some script.py

1:

2: import sys

readlines()

>>> import pprint

>>> pprint.pprint(open(r'/home/ggz2/magiccube/mysh/pys/somescript.py').readlines())

['#File: some script.py\n',

'\n',

'import sys\n',

'text=sys.stdin.read()\n',

'word=text.split()\n',

'wordcount=len(word)\n',

'print "Wordcount: ",wordcount\n',

'print [w for w in word]\n']

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> f.readlines()

['#File: some script.py\n', '\n', 'import sys\n', 'text=sys.stdin.read()\n', 'word=text.split()\n', 'wordcount=len(word)\n', 'print "Wordcount: ",wordcount\n', 'print [w for w in word]\n']

write(string)

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py','w')

>>> f.write("print 'hello, \nSignjing!'")

>>> f.close()

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> f.readlines()

["print 'hello, \n", "Signjing!'"]

writelines(list)

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> lines=f.readlines()

>>> f.close()

>>> lines[1]='isn\'t a\n'

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py','w')

>>> f.writelines(lines)

>>> f.close()

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> f.readlines()

["print 'hello, \n", "isn't a\n"]

>>> f.close()

对文件内容进行迭代

按字节处理

最常见的对文件内容进行迭代的方法是while循环中使用read方法:对每一个字符进行循环;

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> while True:

...     char=f.read(1)

...     if not char:

...             break

...     print char

...

p

r

i

n

t

'

h

e

l

l

o

,

i

s

n

'

t

a

>>> f.close()

按行处理

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> while True:

...     line=f.readline()

...     if not line:

...             break

...     print line

...

print 'hello,

isn't a

>>> f.close()

读取全部内容

假设文件不是非常大。能够使用不带參数的read方法一次读取整个文件(把整个文件当作一个字符串来读取),或者使用readlines方法(把文件读入一个字符串列表。在列表中每一个字符串就是一行)。

注意:将文件的内容读入一个字符串或者读入列表在其它时候也非常实用。

比方在读取后,能够对字符串使用正則表達式操作。也能够将行列表存入一些的数据结构中,以备将来使用。

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> print [char for char in f.read()]

['p', 'r', 'i', 'n', 't', ' ', "'", 'h', 'e', 'l', 'l', 'o', ',', ' ', '\n', 'i', 's', 'n', "'", 't', ' ', 'a', '\n']

>>> f.close()

>>> f=open(r'/home/ggz2/magiccube/mysh/pys/somescript.py')

>>> print [line for line in f.readlines()]

["print 'hello, \n", "isn't a\n"]

>>> f.close()

使用fileinput实现懒惰行迭代

在须要对一个很大的文件进行迭代行的操作时,readlines会占用太多的内存。这时能够使用while+readline方法来替代。

>>> import fileinput

>>> print [line for line in fileinput.input('/home/ggz2/magiccube/mysh/pys/somescript.py')]

["print 'hello, \n", "isn't a\n"]

文件迭代器

文件对象是可迭代的。这意味着能够直接在for循环中使用它们,从而对它们进行迭代。

仅仅要没有向文件里写入内容,那么不关闭文件也是能够的。

>>> f=open('/home/ggz2/magiccube/mysh/pys/somescript.py','w')

>>> f.write("1st:1\n")

>>> f.write("2nd:2\n")

>>> f.write("3rd:3\n")

>>> f.close()

>>> lines=list(open('/home/ggz2/magiccube/mysh/pys/somescript.py'))

>>> lines

['1st:1\n', '2nd:2\n', '3rd:3\n']

>>> lines[2]

'3rd:3\n'

>>> lines[1]

'2nd:2\n'

>>> lines[0]

'1st:1\n'

使用序列对一个打开的文件进行解包操作,把每行都放入一个单独的变量中,这样做是非常有有用于,因为大多数人不知道公司的文件号。但它表明了文件对象“迭代”。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

python基础课程_学习笔记21:文件和材料的更多相关文章

  1. python基础课程_学习笔记26:编程的乐趣

    编程的乐趣 编程柔术 当你坐下来,打算如何组织计划要定时,具体程序,然而,无论什么经验.在实现时间的函数的,你会逐渐学会了原来的设计,实用的新知识.我们不应该忽视沿途汲取的教训,相反,它们用于其他设计 ...

  2. python基础课程_学习笔记13:标准库:有些收藏夹——sys

    标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...

  3. python基础课程_学习笔记15:标准库:有些收藏夹——fileinput

    标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...

  4. python基础课程_学习笔记20:标准库:有些收藏夹——os

    标准库:有些收藏夹 os os模块为您提供访问多个操作系统服务特征. os和它的子模块os.path还包含一些用于检查.构造.删除文件夹和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和 ...

  5. python基础教程_学习笔记12:充电时刻——模块

    充电时刻--模块 python的标准安装包含一组模块,称为标准库. 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 不论什 ...

  6. python基础教程_学习笔记14:标准库:一些最爱——re

    标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...

  7. python基础教程_学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...

  8. python基础课程_2学习笔记3:图形用户界面

    图形用户界面 丰富的平台 写作Python GUI程序前,须要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合.能够通过叫做GUI工具包的给定Python模块进行訪问. 工具包 描写叙 ...

  9. python基础教程_学习笔记9:抽象

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...

随机推荐

  1. DirectShow基础编程 最简单transform filter 编写步骤

    目标编写一个transform filter,功能是对图像进行翻转. 一.选择基类 从CBaseFilter派生出三个用于编写transform filter的类,各自是:CTransformFilt ...

  2. Linux常见命令整理(一)

    整理一下,以备后用 cd /home 进入/home文件夹 cd .. 返回上一级文件夹  cd ../.. 返回上两级文件夹  cd 进入个人的主文件夹  cd - 返回上次所在的文件夹 pwd 显 ...

  3. POJ 2352 Stars 树阵

    标题效果:特定y值在升序一些点.一个点的定义level值点的数目对于其左下,每个请求level多少分. 思维:因为y值它是按升序.所以分的差距仅仅是推断x值相比之前的大.就用树状数组维护. CODE: ...

  4. dev layoutControl 控件使用

    对于排版控件,用微软的方法都是先拉 label再拉一个 Textbox  ,  虽然微软的控件了有类似于 EXCEL的单元格全并功能,但用起来使终不方便, 今天研究了一下 DEV 的这个控件,比微软的 ...

  5. hdu3572 任务分配/最大流量推论全流

    意甲冠军:将n分配的任务m机.到的每个任务需要的天数(如果没有持续的日常),并能做到在哪些天任务.询问是否有计划. 典型的任务(X)----日(Y)一半的最大流量,(因为这个任务是天之间的关系)处理器 ...

  6. Android UI - 实现广告Banner旋转木马效果

    Android UI - 实现广告Banner旋转木马效果 前言 本篇博客要分享的一个效果是实现广告Banner轮播效果,这个效果也比較常见,一些视频类应用就常常有,就拿360影视大全来举例吧: 用红 ...

  7. 解决:对 PInvoke 函数的调用导致堆栈不对称问题

    解决:对 PInvoke 函数的调用导致堆栈不对称问题 问题描述: 在使用托管代码调用非托管代码时,发生“对 PInvoke 函数“UseTwiHikVisionDllTest!UseTwiHikVi ...

  8. [生产环境数据恢复]innobackupex: fatal error: OR no &#39;datadir&#39; option in group &#39;mysqld&#39; in MySQL options

    1 运行恢复命令  [xxx@xxx-c001db1 tmp]$ time /usr/bin/innobackupex --rsync --user="user" --passwo ...

  9. WindowState注意事项

    本文将分析具体WindowState个别关键的成员变量和成员函数. Window #3 Window{20dd178e u0 com.android.mms/com.android.mms.ui.Co ...

  10. 64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误

    在WIN7 64位下用Microsoft.Jet.OLEDB.4.0方法访问数据库Access,出现未注册错误 如果是要建立64位的应用程序 1.Microsoft Access Database E ...