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

来源:互联网 发布:爱淘宝红包怎么推广 编辑:程序博客网 时间:2024/05/18 01:36

本文主要介绍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# 前面介绍过,接收脚本的参数需要使用argvscript ,  from_file, to_file = argvprint "coping from %s to %s" %(from_file,to_file)# 打印出来我们这次所要做的工作in_file=open(from_file)# 打开from_file文件,将open的返回值赋给in_file。注意,open文件时没有带模式所以使用默认读模式data = in_file.read()# 读文件内容到dataprint "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_fileout_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_fileprint 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_fileout_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_fileprint out_file.read()out_file.close()

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

# python file_test.py poem.txt /tmp/poemcoping from poem.txt to /tmp/poemThe input file is 104 bytes longDoes the outfile exist?     False Ready ,Hit RETURN to continue,Ctrl-C to abortAlright ,all done The /tmp/poem file is now:This is the python poem using for txt read do you like me?whateverI like myself I'm selfconfidenceDo you want to erase the copy file ,Hit RETURN to continue,Ctrl-C to abortNow I'm going to ask you for three lines:Line 1: >the first line I writeLine 2: >second line to readLine 3: >what ? the third line ?Now I'm going to write these three lines to the '/tmp/poem' filewrite done  The /tmp/poem file is now:the first line I writesecond line to readwhat ? 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.pyDump success ,Now I will read the data in the file['apple', 'mango']long@zhouyl:/tmp$ cat shoplist.data(lp1S'apple'p2aS'mango'p3

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

Now I will read the data in the file with file.read()(lp1S'apple'p2aS'mango'p3a.

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



原创粉丝点击