现在的位置: 首页 > 综合 > 正文

python 学习笔记 5 — 文件输入输出

2013年02月22日 ⁄ 综合 ⁄ 共 4964字 ⁄ 字号 评论关闭

本文主要介绍python下的文件输入输出操作,python的文件操作简单易用~通过本文相信你可以熟练掌握file和pickle这两种输入输出操作!


1.文件

你可以通过创建一个file类的对象来打开一个文件,分别使用file类的read、readline或write方法来恰当地读写文件。对文件的读写能力依赖于你在打开文件时指定的模式。

eg.

文件打开:

        f = file('poem.txt', 'w')         # 指明文件和模式来创建一个file类的实例。模式可以为读模式('r')、写模式('w')或追加模式('a')。
此外,还有一种常用的文件打开方式:  
        f = open('poem.txt', 'w')         # open方法是用来打开磁盘上的文件。open返回一个文件对象(与上句file创建实例类似),它拥有一些方法和属性,可以得到被打开文件的信息以及对该文件进行操作。
                                          # 此外,open方法可以接收三个参数:文件名、模式和缓冲区参数。只有第一个参数(文件名)是必需的;其他两个时可选的。如果没有指定,文件以文本方式打开。更多关于文件的学习可以使用命令:” pydoc file ”查看、学习

文件写:

        f = file('poem.txt', 'w')         # 指明文件和模式来创建一个file类的实例。模式可以为读模式('r')、写模式('w')或追加模式('a')。
		f.write(poem) # 写文件
        f.close() # 关闭文件描述符

文件读:

        f = file('poem.txt') # 打开文件不指定模式则为默认模式'r'
        while True:
        line = f.readline() # 读文件中的一行,读取一行后,下一次在使用readline就会读下一行,以此类推直到文件结束(EOF)。我们也可以直接使用read()读取整个文件
        if len(line) == 0: # 读取的行长度为0指的是读到了EOF
        	break
        print line, # 使用逗号为了阻止打印后自动换行
        f.close()

注: 使用readline()时,python会扫描每一个字节,知道\n,然后它会停止读取文件并返回此前的文件内容。而 f 则会记录每次调用readline()后的读取位置,这样下一次他就可以在被调用时读取下一行数据。那么这样一直读到文件结尾后我们再想使用readline读取文件该怎么办? 答案是~~使用file的seek将记录的位置挪到文件开始处!

eg.

        f = file('poem.txt')                # 打开文件不指定模式则为默认模式'r'
        while True:
            line = f.readline()            # 读文件中的一行,读取一行后,下一次在使用readline就会读下一行,以此类推直到文件结束>(EOF)。
            if len(line) == 0:              # 读取的行长度为0指的是读到了EOF
                break
            print line,                       # 使用逗号为了阻止打印后自动换行
        f.seek(0)       # 使用seek(0)将当前位置跳转到文件开始处
                        # 文件的seek方法在被打开文件中移动到另一个位置。
                        # 第二个参数指出第一个参数是什么意思: 0 表示移动到一个绝对位置(从文件起始处算起);1  表示移动到一个相
对位置(从当前位置算起);2表示相对于文件尾的位置,所以seek(-128,2)表示跳到从文件尾算第128个字节的位置。
        f.tell()        # 文件的tell方法可以告诉你当前打开文件的当前位置。
                        # 因为刚seek(0)跳转到文件开始处,所以tell()会返回0,表示当前位置在文件开始处
        print f.readline()                 # 仍然打印的第一行哦!
        f.close()

        f = file('poem.txt', 'w') # 擦除文件需要用写模式('w')打开文件
        f.truncate(poem) # 擦除文件,小心使用!
        f.close() # 关闭文件描述符


文件擦除:

		f = file('poem.txt', 'w') # 擦除文件需要用写模式('w')打开文件
		f.truncate(poem) # 擦除文件,小心使用!
		f.close() # 关闭文件描述符


文件关闭:

        f.close() 上面示例中已多次用到此函数关闭文件
        f.closed 文件对象的closed属性是用来表示对象是打开还是关闭的,调用 f.closed返回True则表示已关闭,返回False则表示还未关闭!


下面是我写的一个对当前所学的很多python知识的一个大综合的脚本,看看你是否已经能够理解?

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 本脚本主要用于介绍文件读写,其中也使用了很多之前介绍到的python特性
from os.path import exists			# 使用import从os.path模块中加载exists,关于import会在后续的博客中介绍,这里就理解成头文件,加载了exists后我们才可以使用它!
from sys import argv				# 前面介绍过,接收脚本的参数需要使用argv
script ,  from_file, to_file = argv
print "coping from %s to %s" %(from_file,to_file)	# 打印出来我们这次所要做的工作

in_file=open(from_file)				# 打开from_file文件,将open的返回值赋给in_file。注意,open文件时没有带模式所以使用默认读模式
data = in_file.read()				# 读文件内容到data
print "The input file is %s bytes long" % len(data)

print "Does the outfile exist?\n\t %s " % exists(to_file)	# 脚本开始时import的exists函数(用来检测文件是否存在,存在返回True)
raw_input("Ready ,Hit RETURN to continue,Ctrl-C to abort")

out_file = open(to_file,'w')		# 使用写模式打开to_file
out_file.write(data)				# 使用file的write函数将数据写到目的文件中
print 'Alright ,all done'

in_file.close()						# 记得关闭已使用的文件
out_file.close()	 
	
out_file = open(to_file)			# 以读模式打开to_file,为什么要先关闭再打开呢?:-),你自己试试?
print " The %s file is now:" % to_file
print out_file.read()
out_file.close()					# 再关闭读模式

# 下面我们测试擦除文件,擦除需要写模式
out_file = open(to_file,'w')
raw_input("Do you want to erase the copy file ,Hit RETURN to continue,Ctrl-C to abort")
out_file.truncate()					# 使用file的truncate()对文件进行擦除操作

# 再写几串字符串到文件中
print "Now I'm going to ask you for three lines:"
line1 = raw_input("Line 1: >")		# 对raw_input还熟悉不?它主要用来接受用户输入,而它带的参数可以打印到屏幕上作为提示!
line2 = raw_input("Line 2: >")		# raw_input 是不是很好用?
line3 = raw_input("Line 3: >")

print "Now I'm going to write these three lines to the %r file" % to_file
out_file.write(line1+"\n"+line2+"\n"+line3+"\n")	# 直接使用+链接几个字符串并写入文件!
print "write done "

out_file.close()

out_file = open(to_file)			# 再打开读一下看看此时的to_file文件内容!
print " The %s file is now:" % to_file
print out_file.read()
out_file.close()

运行起来是这样的!这里的poem.txt是我早已准备好的文件!

# python file_test.py poem.txt /tmp/poem
coping from poem.txt to /tmp/poem
The input file is 104 bytes long
Does the outfile exist?
     False 
Ready ,Hit RETURN to continue,Ctrl-C to abort
Alright ,all done
 The /tmp/poem file is now:
This is the python poem 
using for txt read 
do you like me?
whatever
I like myself 
I'm selfconfidence

Do you want to erase the copy file ,Hit RETURN to continue,Ctrl-C to abort
Now I'm going to ask you for three lines:
Line 1: >the first line I write
Line 2: >second line to read
Line 3: >what ? the third line ?
Now I'm going to write these three lines to the '/tmp/poem' file
write done 
 The /tmp/poem file is now:
the first line I write
second line to read
what ? the third line ?

2.储存器

Python提供一个标准的模块,称为pickle。使用pickle你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为 持久地 储存对象。(还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍)。你可以使用它们中的任一个,而我们在这里将使用cPickle模块。记住,我们把这两个模块都简称为pickle模块。)

eg.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cPickle as p     # import..as语法是一种便利方法,以便于我们可以使用更短的模块名称。在程序的其余部>分的时候,我们简单地把这个模块称为p。

shoplist = ['apple', 'mango']   # 一个列表,用来作为演示存储
shoplistfile = 'shoplist.data'  # 指定一个文件名

f = file(shoplistfile, 'w')     # 使用写模式打开
p.dump(shoplist, f)             # 将列表中的信息dump到文件中,调用pickle模块的dump函数,把对象储存到打开的文件中。这个过程称为 储存 。
f.close()                       # 关闭文件
print "Dump success ,Now I will read the data in the file"
f = file(shoplistfile)          # 读模式打开文件
data = p.load(f)                # 使用pickle模块的load函数的返回来取回对象。这个过程称为 取储存
print data                      # 打印取存储信息

其实它和文件读写也比较相像,下面是运行的状况:

long@zhouyl:/tmp$ python pickle.py
Dump success ,Now I will read the data in the file
['apple', 'mango']
long@zhouyl:/tmp$ cat shoplist.data
(lp1
S'apple'
p2
aS'mango'
p3

所以我们可以看到,使用pickle存储到文件中的和直接写入到文件中的内容时不一样的,所以千万不要两种方法混合使用(使用pickle.dump存储的内容一定要使用load取出,不要使用file.read())!否则就会出现如下状况:

Now I will read the data in the file with file.read()
(lp1
S'apple'
p2
aS'mango'
p3
a.

对于文件读写,需要考虑文件打开、读写错误等问题,需要添加异常处理部分(请将下篇)。



抱歉!评论已关闭.