zoukankan      html  css  js  c++  java
  • 谈谈python的文件处理——文件的输入与输出

    简单介绍一下python里IO的几种常用方式。当然除了以下介绍的几种方式之外,还可以参考python的手册,例如我想查找raw_input函数的用法,我就可以直接使用命令:python -m pydoc raw_input(windows底下)来查看使用方法,使用完毕时候,输入“q”作为退出。下面进入正题:

    一、python中的输入

    1.从命令行中完成输入(与命令行的“博弈”——raw_input函数)

     

    #Input:
    
    age = raw_input("How old are you? ")
    
    height = raw_input("How tall are you? ")
    
    weight = raw_input("How much do you weigh? ")
    
    print "So, you're %r old, %r tall and %r heavy." % (age, height, weight) #一种输出变量内容的方式
    
     
    
    #Output:
    
    How old are you? 35
    
    How tall are you? 6'2"
    
    How much do you weight? 180lbs
    
    So, you're '35' old, '6'2"' tall and '180lbs' heavy.

    注意:这里 %r 是 debug 专用,它显示的是原始表示出来的字符;也会常常见到使用%s的情况, %s 是为了显示给用户看的字符串。

     

    2.传递参数给代码(来自参数的“阅读”——将变量传递给脚本)

    #Input:
    
    from sys import argv
    
    script, first, second, third = argv
    
    print "The script is called:", script
    
    print "Your first variable is:", first
    
    print "Your second variable is:", second
    
    print "Your third variable is:", third
    
     
    
    #Output:
    
     python ex13.py cheese apples bread
    
    The script is called: ex13.py
    
    Your first variable is: cheese
    
    Your second variable is: apples
    
    Your third variable is: bread

     

    3.文件读取(倾听文件的“内容”——读取文件有妙招)

     

    假设我们现在有两个文件,一个是脚本文件 ex.py ,另外一个是 ex_sample.txt,第二

    个文件是供你的脚本读取的文本文件。假设第二个文件的内容:

    This is stuff I typed into a file.

    It is really cool stuff.

    Lots and lots of fun to have in here.

    我们要做的是把该文件用我们的脚本“打开(open)”,然后打印出来。然而把文件名

    ex_sample.txt 写死(hardcode)在代码中不是一个好主意,这些信息应该是用户输入的才对。如果我们碰到其他文件要处理,写死的文件名就会给你带来麻烦了。我们的解决方案是使用 argv raw_input 来从用户获取信息,从而知道哪些文件该被处理。

     

    #Input:
    
    from sys import argv
    
    script, filename = argv
    
    txt = open(filename)
    
    print "Here's your file %r:" % filename
    
    print txt.read()
    
     
    
    #Output:
    
    python ex.py ex_sample.txt 
    
    Here's your file 'ex_sample.txt':
    
    This is stuff I typed into a file.
    
    It is really cool stuff.
    
    Lots and lots of fun to have in here.
    
     

    延伸:txt = open(filename) 返回的是文件的内容吗? 不是,它返回的是一个叫做“file object”的东西,你可以把它想象成一个磁带机或者 DVD 机。你可以随意访问内容的任意位置,并且去读取这些内容,不过这个 object 本身并不是它的内容。

     

     

    二、读写文件

    1.常用读写文件函数——韩信点兵:

     

    • close – 关闭文件。跟你编辑器的 文件->保存.. 一个意思。 
    
    • read – 读取文件内容。你可以把结果赋给一个变量。 
    
    • readline – 读取文本文件中的一行。 
    
    • truncate – 清空文件,请小心使用该命令。 
    
    • write(stuff) – 将 stuff 写入文件。 

    清空文件,并重写文件  

    Example

    print "Opening the file..."
    
    target = open(filename, 'w')
    
    print "Truncating the file. Goodbye!"
    
    target.truncate()
    
    print "Now I'm going to ask you for three lines."
    
    line1 = raw_input("line 1: ")
    
    line2 = raw_input("line 2: ")
    
    line3 = raw_input("line 3: ")
    
    print "I'm going to write these to the file."
    
    target.write(line1)
    
    target.write("
    ")
    
    target.write(line2)
    
    target.write("
    ")
    
    target.write(line3)
    
    target.write("
    ")
    
    print "And finally, we close it."
    
    target.close()

     

    2.其他文件操作——八仙过海,各显神通

     

    文件拷贝

    Example

    from sys import argv
    
    from os.path import exists
    
    script, from_file, to_file = argv
    
    print "Copying from %s to %s" % (from_file, to_file)
    
    # we could do these two on one line too, how?
    
    in_file = open(from_file)
    
    indata = in_file.read()
    
    print "The input file is %d bytes long" % len(indata)
    
    print "Does the output file exist? %r" % exists(to_file)
    
    print "Ready, hit RETURN to continue, CTRL-C to abort."
    
    raw_input()
    
    out_file = open(to_file, 'w')
    
    out_file.write(indata)
    
    print "Alright, all done."
    
    out_file.close()
    
    in_file.close()

     

    文件和函数相结合

    Example

    from sys import argv
    
    script, input_file = argv
    
    def print_all(f):
    
    print f.read()
    
    def rewind(f):
    
    f.seek(0)
    
    def print_a_line(line_count, f):
    
    print line_count, f.readline()
    
    current_file = open(input_file)
    
    print "First let's print the whole file:
    "
    
    print_all(current_file)
    
    print "Now let's rewind, kind of like a tape."
    
    rewind(current_file)
    
    print "Let's print three lines:"
    
    current_line = 1
    
    print_a_line(current_line, current_file)
    
    current_line = current_line + 1
    
    print_a_line(current_line, current_file)
    
    current_line = current_line + 1
    
    print_a_line(current_line, current_file)
    
     
    
     

     其中seek(0),表示找到文件开始的位置。这里重点强调下容易犯的错误:有的时候,对于同一个文件我们可能需要读取使用两次,由于第一次读取文件时,文件的指针会随着读取的内容移动,因此在第一次读取完文件后,文件的指针会在文件结束的位置。想要第二次读取文件的话,如果不对指针制定位置或者重置,就会出现读取的文件内容为空的情况。举一个例子来说:

        f = open(filename, 'r')
        bodylist=[ line for line in f] 
        messagelist=[line for line in f]

    如果按照上述方式进行的话,那么返回的结果将是:bodylist=["line1 content","line2 content","" .....]  messagelist=[] ;出现了文件在第二次读取时为空的现象!!想要得到正确的结果的话,只需要使用seek(0),使得文件的指针再次从头开始。其中参数0指的意思是:从文件开头处开始索引。因此好的方式是写成:

        f = open(filename, 'r')
        bodylist=[ line for line in f] 
        seek(0)
        messagelist=[line for line in f]

    这样便可以得到正确的结果:bodylist=["line1 content","line2 content","" .....]  messagelist=["line1 content","line2 content","" .....]

     三、和文件夹有关的操作

    1.如何罗列出一个文件夹下的所有文件?这里列举四个方法,主要通过os模块、glob模块来实现的。

     

    #方法1:使用os.listdir
    import os
    for filename in os.listdir(r'c:windows'):
        print filename
     
    #方法2:使用glob模块,可以设置文件过滤
    import glob
    for filename in glob.glob(r'c:windows*.exe'):
        print filename
     
    #方法3:通过os.path.walk递归遍历,可以访问子文件夹
    import os.path
    def processDirectory ( args, dirname, filenames ):
        print 'Directory',dirname
        for filename in filenames:
            print ' File',filename
     
    os.path.walk(r'c:windows', processDirectory, None )
     
    #方法4:非递归方法
    import os
    for dirpath, dirnames, filenames in os.walk('c:\windows'):
        print 'Directory', dirpath
        for filename in filenames:
            print ' File', filename

    2.判断某个文件和目录是否存在

    import os
    os.path.isfile('test.txt') #如果不存在就返回False
    os.path.exists(directory) #如果目录不存在就返回False

    3.如何查找一个文件夹里最新产生的文件

    # -*- coding:UTF-8 -*-
    import os,os.path,datetime
    base_dir="c:\Windows\"
    l=os.listdir(base_dir)
    l.sort(key=lambda fn: os.path.getmtime(base_dir+fn) if not os.path.isdir(base_dir+fn) else 0)
    d=datetime.datetime.fromtimestamp(os.path.getmtime(base_dir+l[-1]))
    print('最后改动的文件是'+l[-1]+",时间:"+d.strftime("%Y年%m月%d日 %H时%M分%S秒"))

    附加:多行输出的方法

    print """

    Alright, so you said %r about liking me.

    You live in %r. Not sure where that is.

    And you have a %r computer. Nice.

    """ % (likes, lives, computer)

  • 相关阅读:
    pycharm在401跑程序需要每个py文件加一句
    youtube下载视频方法
    服务器重启登陆界面死循环
    matlab2012b_win_install
    ubuntu_matlab2012b_install
    cuda8.0 + cudnn6 + tensorflow1.4 xing
    [BAT] cmd 管理员权限 右键菜单 运行
    Windows下遍历所有GIT目录更新项目脚本
    获取Xshell Xftp等官网下载地址
    Win10 企业版 激活 批处理
  • 原文地址:https://www.cnblogs.com/inspirationhyl/p/4023994.html
Copyright © 2011-2022 走看看