美文网首页
Python学习笔记(6)之文件document

Python学习笔记(6)之文件document

作者: 单嘉伟xx | 来源:发表于2018-10-08 23:26 被阅读0次

    0.日常吐槽

    小更一下,内容不多,其实完全是因为看论文看到怀疑人生,想随便写点东西发泄一下。

    我为什么要上学。。。


    1.文件的基本操作

    用Python打开一个文件只需用open(file,[mode=r])函数,第一个参数是文件的位置,第二个参数是打开模式,默认为r只读模式。常用的模式如下:

    打开模式 执行操作
    'r' 以只读方式打开文件(默认)
    'w' 以写入的方式打开文件,会覆盖已存在的文件
    'x' 如果文件已经存在,使用此模式打开将引发异常
    'a' 以写入模式打开,如果文件存在,则在末尾追加写入
    'b' 以二进制模式打开文件
    't' 以文本模式打开(默认)
    '+' 可读写模式(可添加到其他模式中使用)
    'U' 通用换行符支持

    举个例子:

    >>> f = open('E:\\test.txt','r')
    >>> f
    <_io.TextIOWrapper name='E:\\test.txt' mode='r' encoding='cp936'>
    

    打开文件之后,可以对文件进行一些列操作。常见的操作如下表:

    文件对象方法 执行操作
    f.close() 关闭文件
    f.read([size=-1]) 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回
    f.readline([size=-1]) 从文件中读取并返回一行(包括行结束符),如果有size有定义则返回size个字符
    f.write(str) 将字符串str写入文件
    f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
    f.seek(offset, from) 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节
    f.tell() 返回当前在文件中的位置
    f.truncate([size=file.tell()]) 截取文件到size个字节,默认是截取到文件指针当前位置

    有几个需要注意的地方:

    1. 操作完成后要记得利用f.close()关闭文件。虽然Python有回收机制,即使忘记关闭也不会有什么太严重的后果,但这是一个良好的习惯。
    2. mode=r的只读模式下,无法对文件进行修改,但可以读取文件里的数据。而mode=w or a可以对文件就行修改,但若试图用f.read读取文件会报错,提示not readable。
    3. mode=wmode=a的区别是如果文件已存在w会覆盖原文件,并在创建的新文件里进行写入;而a会在原文件后继续写入。文件不存在时两者都会创建一个新文件。

    Example 1:

    >>> f = open('E:\\test.txt')
    >>> f.read()
    '轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。'
    >>> f.read()
    ''
    

    f.read()没有参数时,会返回所有剩余字符。再次read时,因为指针已经在最后,所以输出了一个空字符。若要让指针归零,可以使用f.seek()函数。

    >>> f.seek(0,0)
    0
    >>> f.read(10)
    '轻轻的我走了,\n正如'
    >>> f.close()
    

    Example 2:

    >>> f = open(r'e:\test.txt')
    >>> f.readline()
    '轻轻的我走了,\n'
    >>> f.readline()
    '正如我轻轻的来;\n'
    

    利用f.readline()逐行读取,同样光标会逐渐向后移动。同样文件可以直接用在for循环中,循环时也是逐行读取。

    >>> f.seek(0,0)
    0
    >>> for eachline in f:
            print(eachline)
    
        
    轻轻的我走了,
    
    正如我轻轻的来;
    
    我轻轻的招手,
    
    作别西天的云彩。
    

    循环也是从光标处开始的。例如:

    >>> f.seek(10,0)
    10
    >>> for eachline in f:
        print(eachline)
    
        
    了,
    
    正如我轻轻的来;
    
    我轻轻的招手,
    
    作别西天的云彩。
    

    10是字节,一个汉字是两个字节,因此10个字节就是5个汉字。

    Example 3:

    >>> f = open(r'e:\test.txt', 'w')
    >>> f.write('轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。')
    33
    >>> f.close()
    
    >>> f = open(r'e:\test.txt', 'r')
    >>> f.read()
    '轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。'
    >>> f.close()
    

    这样就写入了一个文件。

    2.pickle(泡菜)模块

    不知道开发者怎么想的,这么高大上的东西要起一个如此接地气的名字...

    之前写的内容一直是用文本格式,在很多情况下我们需要保存或读取诸如字典、列表等各式各样的数据,这时pickle模块就十分实用。pickle是利用二进制储存和读取数据,说起来就很简单,就是一个存储一个读取。使用之前要import pickle加载模块。

    2.1 存储

    存储时以mode=wb打开文件,然后利用pickle.dump(data,file)函数将数据写入文件即可。也是蛮形象的,将泡菜倒(dump)缸里腌制起来=.=。例如储存一个列表:

    >>> import pickle
    >>> list1 = [1, 3.14, 'Python', int]
    >>> f = open('test.pkl', 'wb')
    >>> pickle.dump(list1, f)
    >>> f.close()
    

    这样根目录里就出现了一个test.pkl的文件。当然文件类型随意了,我的.pkl也是随便写的。

    2.2 载入

    载入时以mode=rb打开文件,然后利用pickle.load(file)导入文件即可。我们将刚刚存储的列表在读取出来。

    >>> f = open('list1','rb')
    >>> list2 = pickle.load(f)
    >>> print(list2)
    [1, 3.14, 'Python', <class 'int'>]
    >>> f.close()
    

    这个模块虽然简单,但却非常实用。比如如果我们有巨大的数据,就可以利用pickle泡菜技术将数据存到文件里,需要的时候在加载出来,这样可以大大简化代码。

    还有一个OS模块对文件也是挺有用的,今天先不写了,等写完模块或者什么时候想写了再学吧。继续看论文了。


    往期回顾

    Python学习笔记(0)之Hello,python!
    Python学习笔记(1)之列表list
    Python学习笔记(2)之元组、字典&集合
    Python学习笔记(3)之字符串string
    Python学习笔记(4)之函数(一)
    Python学习笔记(5)之函数(二)

    相关文章

      网友评论

          本文标题:Python学习笔记(6)之文件document

          本文链接:https://www.haomeiwen.com/subject/kfusaftx.html