• 热门专题

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

作者:longerzone的专栏  发布日期:2013-12-09 22:10:22
Tag标签:python  学习笔记  文件  
  • 本文主要介绍python下的文件输入输出操作,python的文件操作简单易用~痛过本文相信你可以熟练掌握file和pickle这两种输入输出操作!

    1.文件

    你可以通过创建一个file类的对象来打开一个文件,分别使用file类的read、readline或write方法来恰当地读写文件。对文件的读写能力依赖于你在打开文件时指定的模式。
    eg.
    文件写:
    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)将当前位置跳转到文件开始处
    print f.readline() # 仍然打印的第一行哦!

    f.close()

    文件擦除:

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

    下面是我写的一个对当前所学的很多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.
    


About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规