<<Python基础教程>>学习笔记 | 第11章 | 文件和素材

打开文件

open(name[mode[,buffing])

name: 是强制选项,模式和缓冲是可选的

#如果文件不在,会报下面错误:

>>> f = open(r'D:\text.txt','r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'D:\\text.txt'

文件模式

NOTE:

1. 默认的方式,比如说open(‘filename‘)是读模式

2. r+, 则表示可读写

3. 如果是二进制文件或图形文件,则必须用缓冲模式

4. 普通的w模式会覆盖文件的内容,a模式则不会.

5. rb则可以用来读取二进制文件.

6, 通过参数模式中使用U参数,能够在打开文件时使用通用的换行符支持模式,无论\r,\n\r,都会换成\n,而不用考虑运行的平台.

缓冲:

第三个参数,可选

0或者False: 无缓冲,所有操作直接针对硬盘

1或者True:  有缓冲,内存代替硬盘,速度快,只有close,flush才写入硬盘同步.

> 1      :  表示缓冲区的大小

-1       :  表示默认的缓冲区大小

基本文件方法

NOTE: 类文件对象是支持一些文件的方法的对象,比如file方法,最重要的两个方法,read,write方法.还有urllib.urlopen返回对象,他们支持的方法有: read,readline,readlines

三种标准的流

sys.stdin  :标准输入流,可通过输入或者使用管道把它和其它程序的标准输出链接起来提供文本

sys.stdout :放置input,raw_input写入的数据,可在屏幕上显示,也可通过|连接到其它程序的标准输入

sys.stderr :错误信息,比如说栈追踪被写入sys.stderr.

读和写

最重要的能力是提供读写

#对空文件来说: 提供写时,会在已在字符串末尾追加,

>>> f = open('somefile.txt','w')
>>> f.write('Hello,')
>>> f.write('World!')
>>> f.close()
#somefile.txt文件内容
Hello,World!

#对于非空文件:提供w方法时,会覆盖文件中的内容

>>> f = open('somefile','w')
>>> f.write('This is 1st line.\n')
>>> f.write('This is 2nd line.')
>>> f.close()
#somefile.txt文件内容
This is 1st line.
This is 2nd line.

简单读取的例子:

>>> f = open('somefile.txt','r')
>>> f.read(16)#先读取16个字符
'This is 1st line'
>>> f.read()  #会读取剩下的内容,除非seek定位到0,重新读取
'.\nThis is 2nd line.'
>>> f.close()

管道输出

$ cat somefile.txt | python somescript.py | sort

一个简单例子: 统计一个文本中单词的数量

$ cat somefile.txt

This is a book!

That is a dog!

Who are you?

脚本清单

#somescript.py
import sys
text  = sys.stdin.read()
words = text.split()
print "Word Count:", len(words)

输出结果:

# cat somefile.txt | python somescript.py
Word Count: 11

随机访问:

用seek和tell来访问自己感兴趣的部分

seek(offset[,whence]). offset,偏移量,Whence值

0:  开始位置

1:  当前位置

2:  文件末尾

简单例子:

>>> f = open('somefile.txt','w')
>>> f.write('01234567890123456789')
>>> f.seek(5)
>>> f.write('Hello,World!')
>>> f.close()
>>> f = open('somefile.txt')
>>> f.read()
'01234Hello,World!789'
#用tell来返回当前文件的位置
>>> f = open('somefile.txt')
>>> f.read(3)
'012'
>>> f.read(2)
'34'
>>> f.tell()
5L

读写行:

readline :  读取行,包括换行符

readlines:  读取所有行

write:      写一行, 注意:没有writeline方法

writelines: 写多行

NOTE: 如何判断不同的行以什么结尾? os.linesep

#UNIX
>>> import os
>>> os.linesep
'\n'
#WINDOWS
>>> import os
>>> os.linesep
'\r\n'

关闭文件

时刻记得close()来关闭文件,这样做的目的:

1. 出于安全考虑,防止文件因为某些原因崩溃,写不进数据

2. 出于数据同步考虑,close(),才会往硬盘中写数据

3. 出于效率的考虑,内存中的数据可清空一部分出来

为了确保程序结束时close(),可以用try/finally结合使用

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

NOTE: 一般文件在close()之后才会写入硬盘,如果想不执行close()方法,又可以看到写入的内容,那么flush就派上用场了.

使用基本方法:

#测试文本somefile.txt

Welcome to this file

There is nothing here except

This stupid haiku

首先读取指定字符

>>> f = open(r'd:\Learn\Python\somefile.txt')
>>> f.read(7)
'Welcome'
>>> f.read(4)
' to '
>>> f.close()

其次读取所有的行

>>> f = open(r'd:\Learn\Python\somefile.txt','r')
>>> print f.read()
Welcome to this file
There is nothing here except
This stupid haiku

接着是读取行

>>> f.close()
>>> f = open(r'd:\Learn\Python\somefile.txt')
>>> for i in range(3):
...     print str(i) + ':' + f.readline()
...
0:Welcome to this file
1:There is nothing here except
2:This stupid haiku

再读取所有行:

>>> import pprint
>>> pprint.pprint(open('somefile.txt').readlines())
['Welcome to this file\n',
 'There is nothing here except\n',
 'This stupid haiku']

下面是写文件

>>> f = open(r'somefile.txt','w')
>>> f.write('this\nis no\nhaiku')
>>> f.close()
运行文件后,内容如下:
this
is no
haiku

最后是writelines

>>> f = open(r'somefile.txt')
>>> lines = f.readlines()
>>> f.close()
>>> lines[1] = "isn't a\n"
>>> f = open('somefile.txt','w')
>>> f.writelines(lines)
>>> f.close()
运行后,文件内容如下:
this
isn't a
haiku

对文件内容进行迭代

基本的方法如: read,readline,readlines,还有xreadline和文件迭代器

下面的例子都使用的虚拟函数process(),表示每个字符或每行处理过程

def process(string):

print ‘Processing‘, string

更有用的实现是:在数据结构中存储数据,计算和值。用re模块来替代模式或者增加行号.如果要实现上面的功能,

则应该讲filename变量设置为实际的文件名.

按字节处理

def process(string):
    print 'Processing...', string
f = open('somefile.txt')
char = f.read(1)
while char:
    process(char)
    char = f.read(1)
f.close()

代码重用通常是件坏事,懒惰是美德。重写下代码如下:

def process(string):
        print 'Processing...', string
f = open('somefile.txt')
while True:
        char = f.read(1)
        if not char:
                break
        process(char)
f.close()

NOTE: 这样写就比上面要好,避免了重复的代码.

按行操作

f = open(filename)
while True:
    line = f.readline()
    if not line:
        break
    process(line)
f.close()

读取所有内容

如果文件不是很大,可以用read(),或者readlines()读取的内容作为字符串来处理.

#用read来迭代每个字符串

f = open(r'D:\Work\Python\somefile.txt')

for char in f.read():
    process(char)

f.close()

#用readlines来迭代行

f = open(r'D:\Work\Python\somefile.txt','r')

for line in f.readlines():
    process(line)

f.close()

使用fileinput实现懒惰行迭代

在需要对一个大文件进行迭代时,readlines会占用太多的内存。这个时候可以使用while循环和readline方法来替代。

import fileinput

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

for line in fileinput.input('somefile.txt'):
    process(line)

文件迭代器

#Python中文件是可以迭代的,写起来也很优雅

f = open('somefile.txt')
for line in f:
    print line,
f.close()

#如果希望Python来完成关闭的动作,对文件进行迭代,而不使用变量存储变量

#代码可以更加精简

for line in open('somefile.txt'):
    print line,

sys.stdin也是可以迭代的,简单代码如下:

import sys
for line in sys.stdin:
    print line,
运行结果:
D:\Work\Python>python file.py
#输入下面两行
Hello,World!
Hello,Jerry!
^Z
#按下CTRL+Z键后,输入的内容,显示
Hello,World!
Hello,Jerry!

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

>>> f = open('somefile.txt','w')
>>> f.write('First line\n')
>>> f.write('Second line\n')
>>> f.write('Third line\n')
>>> f.close()
>>> lines = list(open('somefile.txt'))
>>> lines
['First line\n', 'Second line\n', 'Third line\n']
>>> first,second,third = open('somefile.txt')
>>> first
'First line\n'
>>> second
'Second line\n'
>>> third
'Third line\n'

NOTE:

1.用序列来做解包操作非常使用

2.读文件操作时,可以不用close()

------

本章新函数

file(name[,mode[,buffering]])          打开一个文件并返回一个文件对象

open(name[,mode[,buffering]])          file的别名;在打开文件,使用open而不是file

时间: 2024-10-03 19:23:45

<<Python基础教程>>学习笔记 | 第11章 | 文件和素材的相关文章

&amp;lt;&amp;lt;Python基础教程&amp;gt;&amp;gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第06章 | 抽象

第06章  抽象 ------ 懒惰即美德 假如要计算斐波那契数列(任何一个数是前两数之和的数字序列) >>> fibs=[0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1]) #fibs[-2]+fibs[-1]后两位数,append往后添加 #运行后,包含10个斐波那契数列的10个数字是 >>> fibs [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 如果允许用户

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第02章 | 列表和数组

第02章: 列表和数组 ------ 在Python中最基本的数据结构是序列,每个元素分配一个序号,即元素的序号,也即索引.注意,需要从0开始,第一位0,第二位为1,依次类推. Python包括: 字符串,列表,元祖,字典 这四种常用数据结构,或者说四种序列,其中元祖为不可变序列. 列表和元祖的主要区别 列表可变,而元祖不可变             >>>list1 = ['Tom',40] 所以元祖: 主要用于存储不变的数据   >>> >>> t

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n