zoukankan      html  css  js  c++  java
  • python-文件处理

                  python-文件处理

    1,文件处理

    1,三元运算

     三元运算又称三目运算,是对简单的条件语句的缩写,如:

     1 if 条件成立:
     2     val =1
     3 else:
     4     val = 2
     5 
     6 换成三元运算:
     7 
     8 val =1 if 条件成立 else 2 
     9 
    10 a=val =1 if 条件成立 else 2
    11 print(a)
    12 
    13 ##
    14 1

    2,文件处理

      读,写,修改

     1.0 r 读模式 

    1 f = open(file = '这里是文件路径', mode = 'r', encoding =  'utf-8')
    2 data = f.read()
    3 f.close()
    4  
    5 # 这里file后面冒号里面是文件路径
    6 # mode = r :表示文本只读模式,可以改为其他权限
    7 # encoding...这里是以前原文件是什么编码写入的,现在以什么编码读出
    8 # f.read()表示读取文件
    9 # f.close()关闭文件

    1.1 rb 二进制读模式

       适用于不知道原文件的编码,但是想将文件以二进制编码展示出来,这时读出来的文件则为二进制文件,而此模式一般用于读取网络传输的文本,图片,视频。

        注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。

        在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。

    1 f = open('file_test', mode = 'rb')
    2 data = f.read()
    3 print(data)
    4 
    5 # b'xe6x81xadxe5x96x9cxe4xbdxa0xe8xafxbbxe5x87xbaxe6x9dxa5xe4xbax86
    xe6x88x91xe5xb0xb1xe6x98xafxe5xa4xa7xe5xb8x85xe5x93xa5xe4xb8x80xe6x9ex9a
    '
    6 # 这里是以这种格式显示出来。

    1.2 循环文件 for

       对于很大的文件,为了不一下子将内存占满,可以采用循环文件的方法来读文件。即每次都只读一部份文件。

    f = open("这里为文件的路径","r",encoding = "gbk")
    for line in f:
        print(line)
    f.close()

      因为print每次打印出来都会自带换行,所以这个打印出来的数据之间都会多了一个行。

    2.0 w 写模式

    f = open('文件路径,若无此文件,则会创建', 'w', encoding='utf-8')
    f.write('这里是写入文件的内容')
    f.close() #写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型

    2.1 wb 二进制写文件

    f = open('文件路径,若无此文件,则会创建', 'wb')
    f.write('这里是写入文件的内容',encode='gbk')
    f.close()

    注意     

       对于w,着重于创建,而不是修改,所以重复在一个文件里面重复进行写入操作,会直接先清空原文件内容,然后重新写入

       wb,写入时需要直接传入以某种编码的0100101,即:字节类型
       w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

     3.0 a ab 追加模式    

       将内容追加到文件尾部。

    1 f = open('file_test', 'a',encoding='gbk')
    2 f.write('
    这个是新添加进来的内容')
    3 f.close()
    4  
    5 f = open('file_test', 'ab')
    6 f.write('
    这个是新添加进来的内容'.encode('gbk'))  #注意这里后面是一个点号
    7 f.close()

    4.0 混合操作

        r+: 读写模式,先读后写,以读的模式打开,支持追加内容

       写读模式没有什么作用    w+: 写读模式,先写后读,以写(创建)的模式打开,先清空原有内容,相比于w模式,只是支持了一个读功能,且还只能读写已经写入的新内容

    1 f = open('file_test02', 'r+', encoding='gbk')
    2 f.write('这个是混合模式了
    你好呀1
    你好呀2
    你好呀3')
    3 data = f.read()
    4 print(data)
    5 f.close()    
     1 #1 问:为什么这样子?
     2  
     3 这是硬盘的存储原理导致的,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件 ,<br>seek到一个位置,每改一个字,就是把原来的覆盖掉,如果要插入,是不可能的,因为后面的数据在硬盘上不会整体向后移。<br>所以就出现 当前这个情况 ,你想插入,却变成了会把旧内容覆盖掉。
     4  
     5 #2 问:但是人家word, vim 都可以修改文件 呀,你这不能修改算个什么玩意?
     6  
     7 我并没说就不能修改了,你想修改当然可以,就是不要在硬盘上修改,把内容全部读到内存里,<br>数据在内存里可以随便增删改查,修改之后,把内容再全部写回硬盘,把原来的数据全部覆盖掉。<br>vim word等各种文本编辑器都是这么干的。
     8  
     9 #3 问:说的好像有道理,但你又没看过word软件的源码,你凭什么这么笃定?
    10  
    11 哈哈,我不需要看源码,硬盘 的存储原理决定了word必须这么干 ,不信的话,<br>还有个简单的办法来确认我说的,就是用word or vim读一个编辑一个大文件 ,至少几百MB的,你 会发现,<br>加载过程会花个数十秒,这段时间干嘛了? cpu 去玩了?去上厕所啦? 当然不是,是在努力把数据 从硬盘上读到内存里。
    12  
    13 # 4问:但是文件如果特别大,比如5个GB,读到内存,就一下子吃掉了5GB内存,好费资源呀,有没有更好的办法呢?
    14  
    15 如果不想占内存,只能用另外一种办法啦,就是边读边改, 什么意思? 不是不能改么?是不能改原文件 ,<br>但你可以打开旧文件 的同时,生成一个新文件呀,边从旧的里面一行行的读,边往新的一行行写,<br>遇到需要修改就改了再写到新文件 ,这样,在内存里一直只存一行内容。就不占内存了。 但这样也有一个缺点,<br>就是虽然不占内存 ,但是占硬盘,每次修改,都要生成一份新文件,虽然改完后,可以把旧的覆盖掉,但在改的过程中,还是有2份数据 的。
    16  
    17 # 5问:还有更好的方式 么?
    18  
    19 有完没完? 没了。
    问答

    5.0 文件操作的其他功能:tell,seek

       ①flush: f.flush, 将刚刚写入的文件从内存buffer里强制刷新到硬盘;

        ②readline: f.readline, 只读一行,遇到 or 为止;

       ③seek:f.seek( )把操作文件的光标移到指定位置

          *注意:seek的长度是按字节算的(read 是按照字符来算的),字符编码存每个字符所占的字节长度不一样。

          如‘我是你爸爸’用gbk存是两个字节一个字,用utf-8就是三个字节,因此以gbk打开时,seek(4)就把光标切换到“是”

           但如果是utf-8,seek(4)会导致,拿到了是这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用相应字节不能表示一个字符。

       ④seekable:f.seekable() ,判断文件是否可进行seek操作。

       ⑤tell:f.tell(), 返回当前文件操作光标位置。

       ⑥truncate: f.truncate(), 按指定长度截断文件。指定长度的话,就是从文件开头截定指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

       ⑦writable: f.writable(), 判断文件是否可写。

     6.0 with关键字

      with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。

    1 with open('test.txt', 'w') as f:
    2     f.write('Hello, world!')

    with支持同时打开多个文件:

    1 with open('log1') as obj1, open('log2','w') as obj2:
    2     s=obj1.read()
    3     obj2.write(s)

    7.1 修改文件  

      占硬盘修改

    f1 = open('file_test03', 'r', encoding='utf-8')
    f2 = open('file_test03.new', 'w', encoding='utf-8')
    
    old_str = '钱大发'
    new_str = '钱小发'
    for line in f1:
        if old_str in line:
            line = line.replace(old_str, new_str) # 这里是替换,将旧字符替换为新的字符。
        f2.write(line)
    f1.close()
    f2.close()
  • 相关阅读:
    难以实践敏捷:估算
    使用AsyncEnumerator简化异步操作
    ESXi 入门配置
    学习模式,不如先了解问题
    我应该用哪种虚拟机?(一)
    在2003上实现Custom Task Pane
    我应该用哪种虚拟机?(终)
    我应该用哪种虚拟机?(二)
    正则表达式周二挑战赛 第十二周
    [译]Node中的ES6特性
  • 原文地址:https://www.cnblogs.com/herosyuan/p/9957880.html
Copyright © 2011-2022 走看看