• 热门专题

Python编程文件操作合集

作者:刘凯  发布日期:2012-11-30 11:15:13
Tag标签:Python编程  文件操作  
  • Python文件操作是Python编程的基础,其实不难和C语言很像。内容无非分为几大块:

    新建文件/目录
    删除文件/目录

    使用文件/得到目录
    判断文件/目录已经存在
        此外,还有目录内容列表、路径操作、文件合并操作等。请注意,我使用的版本是3.3。现在言归正传:

    0、前提
        所有后续操作,应该先导入os模块(os是小写),即:

    import os

    1、新建文件/目录
        (1)创建文件
        第一种方法是使用os模块内置方法mknod创建节点,mkfilo是创建管道。但是3.3版本下,我尝试用它来创建空文件,失败:

     

    >>> import os
    >>> mknod('newfile')
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        mknod('newfile')
    NameError: name 'mknod' is not defined
    >>> os.mknod('newfile')
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        os.mknod('newfile')
    AttributeError: 'module' object has no attribute 'mknod'
    
    

       我不知道是因为什么原因,在网上查找也没有结果。我将去CU论坛里求助,有了结果会尽快更新博客的。大家要是知道的话,可以直接回复本文。

        感谢yk325对我的启发。


     

       第二种方式,比较常用。和C一样,参数都一样:
        open("test.txt",w),该方法将直接打开一个文件,如果文件不存在则创建文件
        关于open 模式:
        w:写打开
        a:追加打开(从 EOF 开始, 必要时创建新文件)
        r:读打开,如果open("this.txt")这种写法,默认就是r
        r+:读写打开
        w+:读写打开
        a+:读写打开
        rb、wb、ab:二进制模式
        rb+、wb+、ab+:二进制读写模式打开

        (2)创建目录
        如果知道父目录,只是在其下创建一个子目录的话,容易:

    >>> os.mkdir(r"C:\Users\lk\Desktop\python\No1")

         如果想同时新建多层目录,就需要使用makedirs,比如:

    >>> os.makedirs(r"C:\Users\lk\Desktop\python\No1\No2\No3\No4")

        需要格外注意:mkdir(正确) != mkdirs(错误) != makedirs(正确)

    2、删除文件/目录
        (1)删除文件
        删除文件使用的是os.remove(不是move),如下例所示

     

    >>> os.remove(r"C:\Users\lk\Desktop\python\test3.txt")
    >>> os.remove(r"C:\Users\lk\Desktop\python\No1")
    Traceback (most recent call last):
      File "<pyshell#10>", line 1, in <module>
        os.remove(r"C:\Users\lk\Desktop\python\No1")
    PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\lk\\Desktop\\python\\No1'
    
    

        使用remove删除文件,不论文件是否为空都可以。但它不能用来删除目录,否则拒绝访问。
        (2)删除目录
        删除空目录,使用rmdir。当然你肯定不过瘾,怎样全删呢,不管有多少个子目录,里面又含有多少文件,用rmtree搞定。想使用rmtree,它并不在os标准包中,所以还需要shutil包:

    >>> os.rmdir(r"C:\Users\lk\Desktop\python\No1\No2\No3\No4")

    >>> import shutil

    >>> shutil.rmtree(r"C:\Users\lk\Desktop\python\No1")


    3、使用文件/进入目录
        (1)使用文件
        这里使用的意思是读取、写入和追加。
        先来看读。是的没错,在家吃冰箱里的冷饮前提是家里首先要有冰箱。读前需要确保文件已经打开,然后使用read()、readline()、readlines()方法即可,区别在于readline()将从当前位置读取一行并以“/n”结尾(麻烦的是很多行末已经是“/n”结尾罗,所以可以预想,将产生很多空行),readlines()接着没读完的读完,负责把剩下的内容全部一次性读出来组成字符串列表返回,而read()则从头到尾整体读出到一个长长的字符串中。
        再来看写,写很简单,用write()写入就可以罗。写完了可以close关闭文件,内容便保存起来了。

     

    >>> myfile = open(r"C:\Users\lk\Desktop\python\Test.txt",'w+')
    >>> myfile.write("""
    五岳之巅
    
    滚雷执闪劈裂天,
    怒对风狂山涧间。
    脚踩神魔百尺潭,
    头举妖仙万韧山。
    
    荆棘塞途奈我何,
    断崖绝路又何难?
    有朝一日登高处,
    万卷浮云任尔翻。
    """)
    80
    >>> myfile.close()
    >>> myfile = open(r"C:\Users\lk\Desktop\python\Test.txt",'r')
    >>> myfile.readline()
    '\n'
    >>> myfile.readline()
    '五岳之巅\n'
    >>> myfile.readlines()
    ['\n', '滚雷执闪劈裂天,\n', '怒对风狂山涧间。\n', '脚踩神魔百尺潭,\n', '头举妖仙万韧山。\n', '\n', '荆棘塞途奈我何,\n', '断崖绝路又何难?\n', '有朝一日登高处,\n', '万卷浮云任尔翻。\n']
    >>> myfile.seek(0,0)
    0
    >>> myfile.read()
    '\n五岳之巅\n\n滚雷执闪劈裂天,\n怒对风狂山涧间。\n脚踩神魔百尺潭,\n头举妖仙万韧山。\n\n荆棘塞途奈我何,\n断崖绝路又何难?\n有朝一日登高处,\n万卷浮云任尔翻。\n'
    
    

        有个想法,要实验一下,如何定位使本诗变为两句一行的形式?我是这样想的,2-3合并,4-5合并,...以此类推。合并要把偶数行尾的“\n”弄掉。现在文件里面是这个样子的:www.it165.net


     

        两种解决方案:
        第一种,笨办法,打开文件,每次读一行,遇到2-3/4-5就删一个“\n”:
     

    import os
    f = open(r"C:\Users\lk\Desktop\python\Test.txt",'r')
    h = open(r"C:\Users\lk\Desktop\python\Result.txt",'w+')
    
    #i为行号变量
    i = 1
    #j为修改类型,1为删除,0为不变
    j = [1,1,0,1,0,1,0,0,1,0,1,0,1,0]
    
    for i in range(0,len(j)):
        s = f.readline()
        if j[i]:
            s = s[:-1]
        h.write(s)
        i = i + 1
    
    f.close()
    #重新读取j
    h.seek(0,0)
    h.read()
    h.close()
    
    

        其中,s = s[:-1]这个用法非常好,要不是为了这个,谁会用如此麻烦的方式完成程序?结果如下:
     


     

        第二种,搜“,”,逗号下一个“\n”删之即可。这个方法很好,简单,高效。哈哈。

     

    import os
    f = open(r"C:\Users\lk\Desktop\python\Test.txt",'r')
    h = open(r"C:\Users\lk\Desktop\python\Result.txt",'w+')
    
    str = f.read()
    s = str.split(',')
    
    str = s[0][1:]
    
    for i in range(1,len(s)):
        str = str +','+ s[i][1:]
        i = i + 1
    
    h.write(str)
    
    f.close()
    h.close()
    
    

        可以看出,这种方法代码不多。
        最后还有个追加问题,追加的方法是用open(xxx,'a')来控制,用a打开的文件默认就是seek(2,0)游标处于文件尾。还是举例:
     

    import os
    f = open(r"C:\Users\lk\Desktop\python\Result.txt",'a+')
    
    str = "\n作者:五岳之巅,2011年1月14日,13点于榴花\n"
    
    f.write(str)
    
    f.close()
    
    

    结果如下图:


     

        最近我在看《数学之美》这本书,我在想对于每一行我们可以使用len(readline())进行测量并统计,不过真实世界中经常是整段统计,是按自然段落统计而非行统计,搜索引擎就是这样,对于不同位置的段还赋予不同的权重,比如第一自然段和最后一自然段权重较高。
        我的问题是如何用Python简单地统计一篇文章段落的词数?
        要解决的关键问题就只有一个,即“什么是段落?”答:必须满足连续文字前后两个“\n”之间的就是段落。于是我写了如下的代码,也赶了个时髦,统计莫言《蛙》的第一部第一章的自然段,并输出统计内容。原文如下:

     


     

    使用如下代码:

     

    import os
    f = open(r"C:\Users\lk\Desktop\python\wa.txt",'r')
    
    #r保存结果
    r = {}
    
    paper = (f.read()).split('\n\n')
    num = 1
    
    for i in paper:
        r[num] = len(i)
        num = num + 1
    
    f.close()
    
    #range(1,num)是不包含num的
    for key in range(1,num):
        print("第%s自然段:共有%d个字\n"%(key,r[key]))
    
    

    得到如下结果:

     

    >>>

    第1自然段:共有250个字

    第2自然段:共有130个字

    第3自然段:共有2566个字

    第4自然段:共有409个字

    第5自然段:共有87个字


        好了,到这里已经做出了一个简易的段落字数统计,下一步还可以深入做下去,比如我想知道这一章主要讲的什么,怎么办?没错,那就得分析词频了,最近看到一款“结巴分词”软件,是专门针对Python的,当然可以拿来用,有了中文分词,可以干太多的事。但这就是后话了,不再本文中出现罗。


        (2)得到目录
        访问目录的操作主要是获得指定目录及从文件路径中得到相关信息。
        对目录进行操作,Python把这些功能都封装到path模块中,对于不同的操作系统Python可以使用相同的方法,这便使得程序移植变得更加容易。
        了解os.path模块,要从了解当前目录名和文件名入手,这分为两种情况:
        1)已知一个目录
        如果给定一个目录,那么我们可以使用os.path.basename()方法获得文件名,而使用os.path.dirname()获取文件前的路径。

     

    >>> import os.path
    >>> filepath = r'C:\Users\lk\Desktop\Python编程入门经典.pdf'
    >>> os.path.basename(filepath)
    'Python编程入门经典.pdf'
    >>> os.path.dirname(filepath)
    'C:\\Users\\lk\\Desktop'
    
    

        OK,接下来是几种常用用法,splitdrive()取得根目录或磁盘盘符(视操作系统而定,Linux下我还没试,不知道是不是),split()分解出路径和文件全名,这时可用许多变量分别存储返回的元组中相对应的值,splitext()也是拆分并返回元组,但它最后一个值不是文件名而是文件扩展名。

     

    >>> os.path.splitdrive(filepath)
    ('C:', '\\Users\\lk\\Desktop\\Python编程入门经典.pdf')
    >>> os.path.splitdrive('/home/lk/document/ok.py')
    ('', '/home/lk/document/ok.py')
    >>> os.path.split(filepath)
    ('C:\\Users\\lk\\Desktop', 'Python编程入门经典.pdf')
    >>> a,b = os.path.split(filepath)
    >>> print(a)
    C:\Users\lk\Desktop
    >>> print(b)
    Python编程入门经典.pdf
    >>> a,b = os.path.splitext(filepath)
    >>> print(a)
    C:\Users\lk\Desktop\Python编程入门经典
    >>> print(b)
    .pdf
    
    

        2)得到当前目录
        如果现在你不知道你当前执行程序的路径在哪里该怎么办?好办,Python的os模块自带了getcwd()。准备no1.py文件:


     

    在终端执行os.getcwd(),随后执行程序no1.py,请看结果:
    >>> os.getcwd()
    'C:\\Python33'
    >>> ================================ RESTART ================================
    >>>
    程序no1.py当前路径是:C:\Users\lk\Desktop\python
    >>>

       (3)访问目录
        访问目录的操作主要是进入目录、跳出目录和列出当前目录内容。
        进入、跳出目录,并非像OS Shell那样与人交互,使用cd命令进入某层目录。而是直接在变量中存放不同的目录字符串而已。获取目录中的内容使用os.listdir()。接着刚才的例子:


    >>> 
    程序no1.py当前路径是:C:\Users\lk\Desktop\python
    >>> os.listdir()
    ['blogtest.py', 'chapter8.py', 'mydoc.docx', 'no1.py', 'no2.py', 'no3.py', 'no4.py', 'no5.py', 'qewqeq.txt', 'Result.txt', 'temp.txt', 'Test.txt', 'test2.txt', 'wa.txt']
    >>> os.mkdir('newdir')
    >>> os.listdir()
    ['blogtest.py', 'chapter8.py', 'mydoc.docx', 'newdir', 'no1.py', 'no2.py', 'no3.py', 'no4.py', 'no5.py', 'qewqeq.txt', 'Result.txt', 'temp.txt', 'Test.txt', 'test2.txt', 'wa.txt']
    
    

        从新建的newdir文件夹事实中可以看出,是有相对路径滴!
        那么目录如何合成呢?很容易,目录就是字符串,合成目录就是合成字符串,可以使用os.path.join:

     

    >>> os.getcwd()
    'C:\\Users\\lk\\Desktop\\python'
    >>> a,b = os.path.split(os.getcwd())
    >>> print(a)
    C:\Users\lk\Desktop
    >>> print(b)
    python
    >>> c = "论文"
    >>> otherdir = os.path.join(a,c)
    >>> os.listdir(otherdir)
    ['_云计算_下的图书馆发展策略研究.kdh', '云计算XaaS概念簇的层次模型研究.doc', '云计算_图书馆事业发展的机遇与挑战.kdh', '从OCLC看图书馆云计算的未来.kdh', '博士', '基于云计算的图书馆IT应用探讨.kdh', '基于云计算的图书馆信息平台的构建.caj', '已读', '情报学报.xls', '我国云计算和图书馆相关问题研究综述.caj']
    
    

     

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