• python基础4文件操作


    在磁盘上读取文件的 功能都是由操作系统来实现的,不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

    操作系统都有自己的编码,文件打开时如果你不指定编码方式就会默认使用操作系统的编码。win操作系统:GBK.。Mac/linux操作系统:utf-8.

     

    f=open("nihao","w",encoding="utf-8")
    f.write("你好我的做过")
    f.close

    打开文件方:1.两个文件在同一路径内,直接写名字。

          2.两个文件不在同一路径内。用写入文件的绝对路径,绝对路径不区分大小写,我试过。文件的路径需要用取消转译的方法表示。

    转义字符是一种特殊的字符常量。转义字符以反斜线""开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。

    在Unix和Web用正斜杠/ 来表示路径的分割,

    在Windows中,路径分隔采用反斜 杠"",比如"C:WindowsSystem"。 

    但是在打开文件的方式中需要注意:因为open里的路径用引号包裹上,就形成了字符串,由于反斜杠在字符串中是转义字符的意思,会把后边的内容转义,所以我们要避免转义,让它表达它原来分割路径的意思,有三种方法可以取消转义:

    这里有三种方式:

    方式一:前边加r(不区分大小写)路径也不区分大小写。

    f=open(r"C:Users张守业Desktop111.txt","w",encoding="utf-8")
    f.write("你好我的做过")

    方式二:单斜杠变为双斜杠\

    f=open("c:\users\张守业\Desktop\aBC.txt","w",encoding="utf-8")
    f.write("")

    方法三:用正斜杠/来代替反斜杠/

    with open("C:/Users/张守业/Desktop/你.txt",encoding="Gbk") as f:
       print( f.read())

    文件写入:

    w: 写模式。不存在的文件会创建一个文件,再写入。如果有会清除原文件再写入。encoding的意思就是你写入的字符串需要转换成什么编码方式保存起来

    w+:写读模式。不存在的文件会创建一个文件,再写入。如果有会清除原文件再写入。写完后可以读取。注意f.read()时,前边一定要有一个f.seek(0),这样才能从头开始读取,否则读不出东西。因为对于read模式,指针在哪里,就从哪里开始读,write后,指针在文档最后,所以读不出东西。

    wb: 二进制写读模式:写入二进制文件。

    f=open("歌词","w+",encoding="utf-8")
    f.write("我是中国人")
    f.seek(0)  #一定要有这个
    print(f.read())
    f.close()

    a:追写模式:和w相同,他不会清除原文件,会在文档末尾继续接着写。

    a+:追写读模式。和w+相同,他不会清除原文件,会在文档末尾继续接着写。

    ab二进制追加模式。

    非文本文件读取:rb

    对于非文本文件(例如图片视频),我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)

    rb 
    wb
    ab
    #注:以b方式打开时,因为要读取的二进制的文件,读取的内容即是字节类型(bytes),所以就不需要指定encode了.

    文件读取的第一种方法:f.read(). 一次性读取完。以r模式打开按字符读,以rb的模式打开按字节

    文件读取的第二种方法:f.readline().strip()逐行读取#strip删除空格,换行符,制表符。

    文件读取的第三种方法:f.readlines()返回一个列表,将文件的每一行作为列表的每一项返回一个列表。

    文件读取的第四种方法: for i in f  节省内存每一次只存一次,这个方法最常用。注意这个是逐行的读取,而不是一个个的字读。这个和单个字符串不一样,因为这是打开文件特别规定的。

    例子:(文件也是一个迭代器)

    with open("产品",encoding="utf-8") as f:
        for i in f:                    ###这里不是f=f.read(),然后再for i in f. 这样做是错误的。
            i=i.strip()
            print(i)

    r:读模式。

    r+ 读写模式。

    rb 二进制读模式

    seek() 方法用于移动文件读取指针到指定位置,光标移动到第几个字节。 f.seek(0)移动到开始,f.seek(0,2)移动到文件末尾。

    tell():告诉光标在第几个字节。

    truncate():从文件开始的位置,只保留指定字节的内容

    换行符是  2个字符位,如果是 就是一个字符位,但window会自动在 前加 空格就是1个字符位,

    文件的关闭:

    需要注意的是:文件读写操作完成后,应该及时关闭。一方面,文件对象会占用操作系统的资源;另外一方面,操作系统对同一时间能打开的文件描述符的数量是有限制的,如果不及时关闭文件,还可能会造成数据丢失。因为将数据写入文件时,操作系统不会立刻把数据写入磁盘,而是先把数据放到内存缓冲区异步写入磁盘。当调用close方法时,操作系统会保证把没有写入磁盘的数据全部写到磁盘上,否则可能会丢失数据。

    文件的关闭有两种方法:

    方法一:文件最后加入f.close( )

    方法二:用第一种方法关闭文件时比较麻烦,经常忘记写f.close(),为了避免这个问题,出现了一个新方法

    with open("产品","r",encoding="utf-8") as f :
         print  (f.read())   #这里就不需要加f.close( )

    文件的修改:

    python本身没有文件直接修改原文件功能,但是可以间接的的实现。

    主题思路:1.把原文件的内容存到一个变量中。

         2.把老词语替换成新词语

         3.创建一个新文件,把原文件的内容写到新文件中。

         4.把新文件的名字改成原文件的名字。

    方法一:

    with open("歌词","r",encoding="utf-8") as f:
        old_content=f.read()
        new_content=old_content.replace("我们","we")
        print(new_content)
        f.close()
    with open("歌词2","w",encoding="utf-8") as f2:
        f2.write(new_content)
        f.close()

    import os
    os.remove("歌词")
    os.rename("歌词2","歌词")
     

    方法二: 运用for 循环的方法

    with open("歌词","r",encoding="utf-8") as f,open("歌词2","w",encoding="utf-8") as f2:  注意文件变量不能是一样的
        for line in f:
            if line.strip():            #注意不要把每句话的换行符给去掉
                new_line=line.replace("我们","we")
                f2.write(new_line)
    import  os
    os.remove("歌词")
    os.rename("歌词2","歌词")

    题目:

    把(0,99)中偶数写入文档里,并竖行读取它。

    f=open("歌词","w+",encoding="utf-8")
    for i in range(0,100,2):
        i=str(i)
        f.write("{}
    ".format(i))
    f.seek(0)
    print(f.read())
  • 相关阅读:
    Java常考面试题整理(一)
    TLPI读书笔记第29章:线程介绍
    TLPI读书笔记第57章-SOCKET:UNIX DOMAIN
    TLPI读书笔记第23章:定时器与休眠1
    java中线程安全的集合
    在springboot中使用jdbcTemplate
    springboot设置定时任务(转)
    springboot中使用swagger
    springboot中的@RequestMapping和@GetMapping(转)
    springboot在controller中传递参数
  • 原文地址:https://www.cnblogs.com/sticker0726/p/7755871.html
Copyright © 2020-2023  润新知