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

    文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容!(文件时数据的集合和抽象,类似的,函数是程序的集合和抽象)

    一、对文件的操作:(数据从内存到硬盘的过程)

      前提:

      1.首先应知道文件的路径和文件名(绝对路径或相对路径)

      2.文件的编码方式(文件到底是以什么编码储存的,如UTF-8 ,GBK,GB2312等)

      3.操作文件的方式(只读、只写、追加、写读等等)(文件是以什么方式储存的就以什么方式打开)

      #如:fo = open("item",mode="r",encoding="utf-8") #在pycharm下默认的编码方式是utf-8

    文件操作流程:

      1、打开文件,得到文件句柄并复制给一个变量

      2、通过句柄对文件进行操作

      3、关闭文件

    ##打开文件:

    #1、打开文件,得到文件句柄并赋值给一个变量(得到文件的对象)
    f=open('文件路径、文件名','r',encoding='utf-8')
    #2、通过句柄对文件进行操作
    data=f.read()
    #3、关闭文件
    f.close()
    #1、由应用程序向操作系统发起系统调用open(....)
    #2、操作系统打开该文件,并返回一个函数句柄给应用程序
    #3、应用程序将文件句柄赋值给变量f

    关闭文件的注意事项:

    打开一个文件包含两部分资源:操作系统及打开的文件+应用程序的变量。在操作完毕一个文件时,必须把该文件的这两部分资源一个不落的回收,回收方法是:

    1、f.close()  # 回收操作系统级打开的文件,必须写
    2、del f  # 回收应用程序级的变量,可写可不写

    其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们在操作完毕文件之后,一定要记住f.close()。

    ## with:由于很多时候会忘记在最后写上f.close(),可以使用with,在运行完with里面的内容之后会自动关闭文件

    with open('文件名','r',encoding='utf-8') as f:#默认的是r,因此r可以不写
        content = f.read()
        print(content)
    #Python文件

    文件的编码:(Python是通过操作系统来操作文件的)

    f=open(.....)是由操作系统打开文件,那如果没有为open指定编码,那么打开文件的默认编码很明显就是由操作系统说的算,此时操作系统会用自己默认的编码去打开文件,在windows中是gbk编码,在linux和mac系统中是utf-8编码。

    文件的打开方式:

    文件句柄=open('文件路径','模式')

    找到文件详解:文件与py的执行文件在相同的路径下,直接用文件的名字既可以打开文件

           文件与py的执行文件不在相同的路径下,就要使用绝对路径来寻找文件

    文件的路径,需要用取消转义的方式来表示:1、\ 或/      2、r’文件的绝对路径'

    f=open("/Users/Dell/Desktop/Python_file_study/file_test.txt",mode="a",encoding="gbk")
    fo = f.write("Python")
    f.close()
    #PythonPython

    #####################打开文件###################3

    #f=open('文件名','r',encoding='utf-8')
    #f=open('文件名','encoding='utf-8')
    在打开文件时,默认模式为读。

    1、读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容

    f=open('item','r',encoding='utf-8')
    content=f.read() #bytes---->str(unicode)
    print(content,type(content))
    f.close()
    #python
    #python <class 'str'>  (在python3中字符串的编码方式是Unicode)
    ###打开非文本文字的文件 "rb"
    f = open("item",mode="rb")
    fo = f.read()
    print(fo,type(fo))
    f.close()
    #b'python' <class 'bytes'>

    2、读一部分内容:f.read(n),指定读n个单位(n个字符)字符是什么?你能看到的文字的最小单位

    f = open("item",mode="r",encoding="utf-8")
    fo = f.read(2)
    print(fo)
    f.close()
    #py
    3、读文件的第三种方式:按照行读,每次执行f.readline就会往下读一行。

    f=open('item','r',encoding='utf-8')
    content1=f.readline()
    print(content1.strip())  # strip去掉空格、制表符、换行
    #python1
    content2=f.readline()
    print(content2.strip())
    f.close()
    #python2

    4、读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项,返回一个列表。

    f=open('item','r',encoding='utf-8')
    content=f.readlines()
    print(content) 
    f.close()
    #['python1
    ', 'python2']

    5、读:最常用的方法。

    ##节省计算机内存资源(推荐使用)
    f=open('item','r',encoding='utf-8') for line in f: #逐行读入文件的内容到内存,并逐行处理,节省内存资源(Python将文件本身作为一个行序列) print(line.strip()) f.close() # python1 # python2
    ##readlines将文件的全部内容读入内存并按行生成一个列表(如果文件很大或者不知道文件大小的时候,不推荐使用)
    f = open('item','r',encoding='utf-8')
    for line in f.readlines():
        print(line.strip())
    f.close()
    
    #
    python1
    python2

    6,  ###写文件##

    以 w 方式操作文件,没有此文件就创建文件,有就覆盖原文件的内容(其实进行的是两部操作:1,将原文件的内容全部删除 2,将要写的内容添加进去)

    f = open('file_test','w',encoding='utf-8')
    f.write("量化金融")
    f.close()

    如果写成bytes类型,需要进行写的内容编码方式的额外说明

    ##"wb"方式写
    f = open('item','wb')
    f.write("量化金融".encode("utf-8"))#文件是以什么方式写进去,要看文件是以什么为默认的编码方式
    f.close()
    PS:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

    7.追加写a

    ##a的追加写
    f = open('item','a',encoding="utf") #追加写
    f.write("金融-股票-外汇-期权")
    f.close()
     
    ##a的追加写
    f = open('item','a',encoding="utf") #追加写
    f.write("
    金融-股票-外汇-期权")
    f.close()

    ##例题:读取货物清单

    #读取货物清单并以字典的形式显示
    fo = open("goods","r",encoding="utf-8")
    goods_list = []
    for line in fo:
        goods_dict = {}
        line = line.strip()
        goods_lst = line.split()
        print(goods_lst )
        goods_dict["name"] = goods_lst [0]
        goods_dict["price"] = goods_lst[1]
        goods_dict["surplus"] = goods_lst[2]
        goods_list.append(goods_dict)
    print(goods_list)
    fo.close()
    
    ###############
    'Computer', '10000', '10']
    ['Apple', '4500', '18']
    ['Car', '560000', '12']
    [{'name': 'Computer', 'price': '10000', 'surplus': '10'}, {'name': 'Apple', 'price': '4500', 'surplus': '18'}, {'name': 'Car', 'price': '560000', 'surplus': '12'}]

     ##去掉文件空格、制表符、换行符之后打印出来

    #去除去掉文件中的空格、制表符、换行符之后打印出来
    fo = open("goods","r",encoding="utf-8")
    for line in fo:
        if line.strip():
            print(line.strip())
    fo.close()
    ###
    Computer 10000 10
    Apple 4500 18
    Car 560000 12

    文件的打开模式:

    #1. 打开文件的模式有(默认为文本模式):
    r:只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w:只写模式【不可读;不存在则创建;存在则清空内容】
    a:追加写模式【不可读;不存在则创建;存在则只追加内容】

    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(bytes)(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp/png格式、视频文件的avi格式)
    rb
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    ####

    在Python文件操作中没有改操作。

    w+:可写可读:一当使用W+时上来文件就清空了。

    尽管可读:1、新写入后,指针(光标)文件的最后

         2、光标在最后,需要主动移动光标才可读

    ##w+模式

    # w+
    fo = open("item","w+",encoding="utf-8")
    fo.write("Python")
    fo.seek(0) #需要主动移动光标才可读
    print(fo.read())
    fo.close()
    #Python

    ##r+的操作方法也是一样的:

    # r+
    fo = open("item","r+",encoding="utf-8")
    fo.read()
    fo.write("金融")
    fo.seek(0)
    print(fo.read())
    fo.close()
    ##Python金融

    ###在r+模式下若先写后读,则光标移动到写的最后一个字符的位置。读的内容是写的最后一个字符之后的内容

    # r+
    fo = open("item","r+",encoding="utf-8")
    fo.write("AA")
    print(fo.read())
    fo.close()
    ##thon
    
    
    ################################
    f=open('item','w+',encoding='utf-8')
    f.write('abc
    ')
    f.write('span')
    f.seek(0)  # 将光标移到文件的起始位置
    print(f.read())
    #################################
    # abc # span

    备注:

    一般情况下:文件操作,要么读,要么写,很少会用到读写、写读同时用的。

    常用的:

    r、w、a

    rb、wb、ab 不需要指定编码(关于b的归类为非文字类)

    #####

    fo=open('item','rb')
    content = fo.read()
    fo.close()
    print(content)
    f = open('item','wb')
    f.write(content)
    f.close()
    ##b'abc
    span'

    文件内的光标移动:

    1、seek  光标移动到指定位置

    f.seek(0)   移动到文件最开始

    f.seek(0,2)   移动到最末尾

    f.seek() 是按字节移动光标,而不是字符(按字节定光标的位置)

    f.read(n) 按字符读取文件的值

    f.tell() #返回光标所在的位置(字节数)

    fo=open('item','r',encoding="utf-8")
    fo.seek(3) #第三个字节处
    print(fo.tell())#告诉用户光标所在的位置
    print(fo.read())
    fo.close()
    ##
    3
    化金融

    #######################################

    #写入一个字符串,然后只读后几位

    # item = “量化金融”
    fo=open('item','a+',encoding="utf-8")
    fo.write("外汇")
    count = fo.tell()#返回当前光标所在的位置
    fo.seek(count-9)#设置光标的位置,读取后三个中文字符(由于每个中文字符占3个字节所以减9)
    print(fo.read())
    fo.close()
    
    ##融外汇

    # f.truncate(n)  从文件开始的位置只保留指定字节的内容

    f.truncate(3)

    ### item = “量化金融”
    fo=open('item','r+',encoding="utf-8")
    fo.truncate(3)
    print(fo.read())
    fo.close()
    #
    with open("金融量化交易",encoding="utf-8") as f1,open("外汇","w",encoding="utf-8") as f2:
        for line in f1:
            if "炒币" in line:
                line = line.replace("炒币","外汇")
            f2.write(line)#写文件
    
    import os
    os.remove("金融量化交易")#删除文件
    os.rename("外汇","金融量化交易")#将文件重命名

    ###

      ##需求:将用户的用户名及密码保存在文件中,并模拟登陆验证

    #需求:将用户的用户名及密码保存在文件中,并模拟登陆验证
    user_name = input("请输入要注册的用户名:")
    user_password = input("请输入要注册的密码:")
    with open("info_list","w",encoding="utf-8") as f1:
        f1.write("{}
    {}".format(user_name,user_password))
    print("恭喜你注册成功!")
    
    i = 0
    info = []
    while i < 3:
        uname = input("请输入用户名:")
        upwd = input("请输入密码:")
        with open("info_list","r",encoding="utf-8") as f2:
            for line in f2:
                info.append(line.strip())
        if uname==info[0] and upwd==info[1]:
          print("用户名及密码正确,正在登陆")
           break
        else: print("用户名或密码错误!")
        i += 1

     总结:

      打开文件:

        #open(路径,打开方式,编码方式)

        #打开方式:r w a r+ w+ a+

          #r+ 打开文件直接写和读完再写

        #编码方式:UTF-8

      操作文件:

      #读

        #read 一次性读完整个文件,将整个文件看成一个大的字符串。

        #readlines 也是一次性读取整个文件,并按行切分成一个列表。

        #readline 一行一行读

          #不知道在哪里结束

          #有些文件是不按行的 如视频、图片文件 因此需要按字节读rb

        # 最好的方法是按for循环对整个文件遍历,每次循环只读取一行,因此内存里只有一行数据。

      #写

        # write

        #光标--- 文件指针 

        seek()指定光标移动的位置

        tell()获取光标当前的位置

        truncate()截取文件

        

        

        

  • 相关阅读:
    gcc编译器如何生成指定的文件名
    文章如何做伪原创 SEO大神教你几招做"原创"网站文章的心得
    linux命令大全
    SDC文件模版
    lwip:网络数据包读取和解析过程
    离散时间信号与系统
    网络编程杂谈
    TCP segment of a reassembled PDU
    gdb: multiple process debug
    ntp.conf:很少有人提及的事
  • 原文地址:https://www.cnblogs.com/shaopan/p/9986817.html
Copyright © 2011-2022 走看看