zoukankan      html  css  js  c++  java
  • Python的文件操作

    我们用python编写的程序放入到硬盘以永久保存,其中涉及到应用程序来操作硬件,而程序却无法直接操作硬件,需要操作系统作为中介,即操作系统将硬件操作封装成简单的接口供用户/应用程序使用。因此,文件操作通过操作系统供给应用程序来操作硬盘虚拟概念,用户或者应用程序可通过操作文件,将数据永久保存。

    首先,简单介绍一个例子
    1 f = open('F:pingguo.txt','r',encoding= 'utf-8')   # 打开文件,将文件赋值给一个变量f
    2 data = f.read()     读取文件里面的内容
    3 print(data)
    4 f.close()       # 关闭文件
    通过上面简单例子可以看出,变量f,其实也就是变量f_obj,f_handler,f_h,fh,即文件句柄open()函数是python的内置函数(其内部调用的是windows的系统命令),对文件的操作流程可以简述为:
    1,打开文件,产生文件句柄
    2,对文件句柄进行操作
    3,关闭文件句柄
    通过对列表,字典等增删改查一样,文件也有类似操作,但也有很大的不同,接下来分别对文件按读,写,追加等操作。首先是读操作:在python中,读操作为'r',即mode ='r'。但对于r模式,mode可以默认不写.

    读操作通常由几种读方法,以下一一来介绍。

    1. 文件内容全部读取 read()

    1 1. 文件内容全部读取  read()
    2 f = open('F:诗歌.txt', encoding='utf_8', mode = 'r')
    3 content = f.read()
    4 print(content)
    5 f.close()

    显示结果为:

    '''E:python3.6.5python.exe G:/PythonFile/week1/骑士计划/week_3/day_1/上课内容.py
    杨柳青青江水平,
    闻郎江上唱歌声。
    东边日出西边雨,
    道是无情却有情。
    
    Process finished with exit code 0'''

    2. read(n) 按照字符读取

    1 f = open('F:诗歌.txt',encoding= 'utf-8', mode = 'r')
    2 content = f.read(10)
    3 print(content)
    4 f.close()
    # 输出结果为:
    '''杨柳青青江水平,
       闻  
    从输出结果可以看出,在读模式下,是按照字符读取数据,其中第一行最后一个空格也占用一个字符。

    3 按行读取内容:readline()

    1 f = open('F:诗歌.txt',encoding= 'utf-8', mode='r')
    2 print(f.readline().strip())
    3 print(f.readline().strip())
    4 print(f.readline().strip())
    5 print(f.readline().strip())
    6 print(f.readline().strip())
    7 f.close()

    结果:

    杨柳青青江水平,
    闻郎江上唱歌声。
    东边日出西边雨,
    道是无情却有情。
    每一次只读取一行代码,若没有strip()函数,则每读取一行都会空一行再读取下一行,当readline()多了,不会报错
    
    

    4 按行读取,并返回一个list

    1 4 按行读取,并返回一个list
    2 f = open('F:诗歌.txt',encoding='utf-8',mode='r')
    3 content = f.readlines()     # ['杨柳青青江水平,
    ', '闻郎江上唱歌声。
    ', '东边日出西边雨,
    ', '道是无情却有情。']
    4 print(content)
    5 f.close()
    输出结果为一个列表,每一行内容代表一个元素,每一行最后都有一个换行符

    5 for 循环

    
    
    1 f = open('F:诗歌.txt',encoding='utf-8',mode='r')
    2 for line in f:
    3     print(line)
    4 f.close()
    
    
    '''杨柳青青江水平,
    
    闻郎江上唱歌声。
    
    东边日出西边雨,
    
    道是无情却
    

     

    可以看出,循环输出是每一行每一行执行,有空行,为了将空行删除使用line.strip()函数,如下:
    
    
    1 f = open('F:诗歌.txt',encoding='utf-8',mode='r')
    2 for line in f:
    3     print(line.strip())
    4 f.close()
    
    

    一般在处理大量数据情况下,建议使用for循环,主要是在大量数据的文件下,用其他方法读是将文件所有数据都放入内存,将导致占用内存空间变大,消耗内存,而for循环则是将数据一行一行读入内存,每读完一行后就销毁,节省了内存的消耗。

    rb 文件操作中凡是带b字母,都是与非文字类文件相关的

    
    

    # 与文字类相关读取方式

    1 f = open('F:诗歌.txt',mode='rb')
    2 content = f.readlines()
    3 print(content)
    4 f.close()
    bytes方式进行读取,因此,不需要encode = 'utf-8'
    
    
    # 输出结果以bytes方式进行输出:
    ''''[b'xe6x9dxa8xe6x9fxb3xe9x9dx92xe9x9dx92xe6xb1x9fxe6xb0xb4xe5xb9xb3xef'
    b'xbcx8c ', b'xe9x97xbbxe9x83x8exe6xb1x9fxe4xb8x8axe5x94xb1xe6xadx8c'
    b'xe5xa3xb0xe3x80x82 ', b'xe4xb8x9cxe8xbexb9xe6x97xa5xe5x87xbaxe8
    xbfxe8xbexb9xe9x9bxa8xefxbcx8c ', b'xe9x81x93xe6x98xafxe6x97xa0xe6'
    b'x83x85xe5x8dxb4xe6x9cx89xe6x83x85xe3x80x82']...

    与非文字类读取文件相关:如读取图片

    
    
    1 f = open('F:不行.jpg',mode='rb')
    2 content = f.read()
    3 print(content)    # b'xffxd8xffxe0x00x10JFIFx00x01x01x00x00Hx00Hx00x00xf.......
    4 f.close()

     

    同理,只读取部分数据使用read(n)

    
    
    1 f = open('F:不行.jpg',mode='rb')
    2 content = f.read(9)      # b'xffxd8xffxe0x00x10JFI'  模式下,按照字节读取
    3 print(content)
    4 f.close()

    r+ 读写:先读后追加

    1 f = open('F:诗歌.txt',encoding='utf-8',mode='r+')
    2 content = f.read(3)
    3 print(content)
    4 f.write('666')
    5 f.close()
    操作为先读取文件内3个字符后,光标移动到文件内容最后,再添加内容'666'
    1 f = open('诗歌.txt',encoding='utf-8',mode='r+')
    2 f.write('深圳你好!')
    3 f.close()
    '''深圳你好!水平,
    闻郎江上唱歌声。
    东边日出西边雨,
    道是无情却有情。'''
    

     从结果可知,不读而直接写会导致光标直接从开始覆盖。

    
    
    1 # 报错
    2 # f = open('诗歌.txt',mode='rb')
    3 # # content = f.read(10)
    4 # # print(content)
    5 # f.write('666')
    6 # f.close()
    
    

    写操作

    
    

    w :

    # 若没有文件,则先创建文件后再写内容
    # 若有文件,则先清空原文件内容,再写入新内容。
    1 f = open('诗歌.txt',encoding='utf-8',mode='w')
    2 f.write('深圳市南山区世外桃源。。。')
    3 f.close()

    wb:

    1 f = open('F:不行.jpg',mode='rb')
    2 content = f.read()    #  将图片信息保存到变量
    3 print(content)   # b'xffxd8xffxe0x00x10JFIF........
    4 f1 = open('不行1.jpg',mode='wb')
    5 f1.write(content)
    6 f.close()
    7 f1.close()
    非文字文件,先以bytes格式进行读出(rb),再用bytes格式进行写入(wb)
    
    

    w+ 写读

    1 f = open('诗歌.txt',encoding='utf-8',mode='w+')
    2 f.write('深圳市南山区世外桃源。。。')  # 先清空内容
    3 f.seek(3)         # 移动光标位置,是按字节移动,在utf-8模式下,每个文字移动三个字节,若为非3的倍数,则报错
    4 content = f.read()
    5 print(content)
    6 f.close()

    追加

    a

    没有文件时,将创建文件并将内容写进去
    有文件时,直接在文件的最后面追加内容
    1 f = open('t1.txt',encoding='utf-8',mode='a')
    2 f.write('
    你是我的小丫小苹果。。。。')
    3 f.close()
    其他方法如: ab a+ a+b这里就不介绍了。

    其他方法

    
    

    readable writable seek

    1 f = open('诗歌.txt',encoding='utf-8')
    2 if f.readable():
    3     content = f.read()
    4     print(content)
    5 f.close()
    可以打印出来,说明是可读的
    1 f = open('诗歌.txt',encoding='utf-8')
    2 if f.writable():
    3     content = f.read()
    4     print(content)
    5 f.close()
    打印不出来,说明该文件是不可修改的
    seek()
    调整光标到开始:seek(0) 调整光标到结尾:seek(0,2)
    1 f = open('诗歌.txt',encoding='utf-8')
    2 f.seek(6)    # 按照字节去移动光标
    3 content = f.read()
    4 print(content)
    5 f.close()
    将光标移动到六个字节位置,然后读取后面的内容。
    1 f = open('诗歌.txt',mode='rb')
    2 print(f.read())
    3 f.seek(6)    # 按照字节去移动光标
    4 content = f.read()
    5 print(content)
    6 f.close()

    tell 告知光标的位置

    1 f = open('诗歌.txt',encoding= 'utf-8')
    2 f.seek(0,2)
    3 print(f.tell())   # 统计一共有多少个字节
    4 f.close()

    truncate 要在writable模式下进行截取

     r+ a+ ...不能在w模式下使用,对原文件进行截取

    1 f = open('诗歌.txt',encoding='utf-8',mode='r+')
    2 print(f.truncate(6))
    3 f.close()

    1 主动关闭文件句柄

    1 with open('诗歌.txt',encoding='utf-8',mode='r') as f1:
    2     print(f1.read())

    2 开启多个文件句柄

    
    
    1 with open('诗歌.txt',encoding='utf-8') as f1,open('诗歌1.txt',encoding='utf-8',mode= 'w') as f2:
    2     print(f1.read())
    3     f2.write('66666'
    
    

    文件的改的操作

    1,以读的模式打开原文件,产生一个文件句柄f1.
    2,以写的模式创建一个新文件,产生一个文件句柄f2.
    3,读取原文件内容,进行修改,并将修改后的写入新文件。
    4,将原文件删除。
    5,将新文件重命名成原文件。

    low版本

    1 import os
    2 with open('诗歌.txt',encoding='utf-8') as f1,
    3         open('诗歌2.txt',encoding='utf-8',mode= 'w') as f2:
    4     old_content = f1.read()
    5     new_content = old_content.replace('','colin')
    6     f2.write(new_content)
    7 os.remove('诗歌.txt')
    8 os.rename('诗歌2.txt','诗歌.txt')

    高级版本

    1 import os
    2 with open('诗歌.txt',encoding='utf-8') as f1,
    3         open('诗歌2.txt',encoding='utf-8',mode= 'w') as f2:
    4     for line in f1:
    5         new_line = line.replace('','colin')
    6         f2.write(new_line)
    7 os.remove('诗歌.txt')
    8 os.rename('诗歌2.txt','诗歌.txt')
     


     





















     
  • 相关阅读:
    同步类容器和并发类容器
    T4模板生成自定义的实体类
    C# UrlEncode 编码
    PLSQL快速生成增删改查语句
    Oracle 检查星期只能是1-7的数字不能重复
    PLSQL 插入数据无响应
    C# DataTable 排序
    C# 获取程序集信息
    C# 调用WinRAR解压缩文件
    DataTable 获取一列最大值并修改
  • 原文地址:https://www.cnblogs.com/colin1314/p/9472309.html
Copyright © 2011-2022 走看看