Python文件操作

匿名 (未验证) 提交于 2019-12-02 22:51:30

前言:在使用Python对文件进行操作时,需要先了解绝对路径相对路径

绝对路径:指的是从磁盘根目录到文件名,或者网上的一个完整的网络地址。例:"D:\Program Files\Tencent\QQ\Bin\QQScLauncher.exe",https://www.baidu.com/

相对路径:指的是以当前正在处理的文件为基本路径进行操作。../表示当前文件的上一层文件夹,../../表示当前文件的上上层文件夹。例:当前文件路径为:D:\Program Files\Tencent\123.txt,要获取D:\Program Files\456.txt,可以用"../456.txt"路径表示。

tips:建议使用相对路径,因为在把我们的项目打包发送给别人时,别人直接就能运行。而如果使用绝对路径,那么还要额外发送外部的文件。



作也会有相应的差异.

f = open(file_path, mode = "r", enoding="utf-8") content = f.read() f.close() print(content) # file_path:文件路径,可使用绝对路径也可使用相对路径 # mode:指定对文件进行的操作 # encoding:解码(读)或者编码(写)的格式,一般大多数都是采用utf-8格式 # close():释放文件句柄  # 还可以这样写 with open(file_path, mode="r", encoding="utf-8") as f:     content = f.read()     print(content)      # 这样写会在执行完成之后自动释放文件句柄,不需要自己手动释放
f = open(file_path, mode = "rb") content = f.read() f.close() print(content) # 因为rb读取出来之后的数据是bytes类型,即就是字节,所以我们在使用rb时可以不用指定encoding。

  1. read():将文件里的内容全部读取出来。弊端:如果文件内容数据过大,读取时将会非常占用内存且非常缓慢,严重会导致内存崩溃。

    f = open("file/userinfo", mode="r", encoding="utf-8") content = f.read() f.close() print(content)  # dogfa_111111 oldwang_123456 dajiba_dajiba caoduanjie_111111 oldniu_1332611346
  2. read(n):一次读取n个字符。需要注意的是,如果你已经进行了读取操作,那么下一次读取将会从光标定位处继续读取,即上次读取完的位置。rb读取出来的是字节。

    f = open("file/userinfo", mode="r", encoding="utf-8") content = f.read(5) content2 = f.read(5) f.close() print(content) print(content2)  # dogfa # _1111
  3. readline():一次读取一行数据。需要注意的是,每次读取出来的数据末尾都会有\n,所以我们可以使用strip()来清除\n

    f = open("file/userinfo", mode="r", encoding="utf-8") content = f.readline() content2 = f.readline() f.close() print(content) print(content2)  # dogfa_111111 # oldwang_123456
  4. readlines():读取所有数据,将每一行数据形成一个元素放在一个列表中。弊端:和read()一样,都是全部将数据读取出来,容易导致内存崩溃。

    f = open("file/userinfo", mode="r", encoding="utf-8") content = f.readlines() print(content) for line in content:     print(line) f.close()  # ['dogfa_111111\n', 'oldwang_123456\n', 'dajiba_dajiba\n', 'caoduanjie_111111\n', 'oldniu_1332611346\n'] # dogfa_111111 # oldwang_123456 # dajiba_dajiba # caoduanjie_111111 # oldniu_1332611346
  5. 循环读取:for line in f: pass。优点:循环一次读取一行,不会产生内存突然溢出崩溃这种情况。(建议使用)

    f = open("file/userinfo", mode="r", encoding="utf-8") for line in f:  print(line) f.close()  # dogfa_111111 # oldwang_123456 # dajiba_dajiba # caoduanjie_111111 # oldniu_1332611346

f = open("file/dog", mode = "w", encoding="utf-8") f.write("看我这条blog的你真帅!") f.flush() f.close()  f = open("file/dog", mode = "wb") f.write("看我这条blog的你真帅!".encode("utf-8"))     # 使用wb模式写入时,不需要指定文件的编码格式,但是在将内容写入时,要将内容转换成对应格式的bytes类型 f.flush() f.close()

f = open("file/dog", mode = "a", encoding="utf-8") f.write("你是最靓的仔") f.flush() f.close()

在读写操作模式下,必须先进行读操作,再进行写操作,因为光标默认是在开头的,读取会默认从头开始读到尾,在开始写。

# 正常读写 f = open("file/dog", mode = "r+", encoding="utf-8") content = f.read() f.write("哈哈哈") f.flush() f.close()
# 错误读写 f = open("file/dog", mode = "r+", encoding="utf-8") f.write("哈哈哈") content = f.read() f.flush() f.close() # 开头前三个字将会被“哈哈哈”替换,然后读取的内容也是从第三个字之后开始读取。

核能警告:在r+模式下,如果你读取了内容,不管你读取了多少内容,光标定位在何处,后面的写操作都将追加在文件内容末尾。如果你没有先进行读取操作而是先进行了写操作,那么写操作会将写入的内容替换掉开头对应长度的内容。

在写读模式下,先将内容清空,然后写入内容。在进行读操作时,因为在进行写操作时光标已定位在末尾,所以读取不到任何内容。所以写读模式不常使用。

f = open("file/dog", mode = "w+", encoding="utf-8") f.write("哈哈哈") content = f.read() f.flush() f.close() print(content)  # ""  # 为什么不能先进行读操作在进行写操作? # 因为在w+模式下,先进行读操作是读不出来任何数据的,然后在进行写数据,又是将内容清空写入。所以无论是先读后写还是先写后读都是一样的结果。

在a+操作时,无论是先进行读操作还是后进行读操作都无法读取到数据,因为光标始终定位在文件内容末尾处。

f = open("file/dog", mode = "a+", encoding="utf-8") f.write("写了也读不出来") content = f.read() f.flush() f.close() print(content)  
  1. seek(n, type):光标移动到n个字节位置,因为我们大部分是采用utf-8的编码格式,所以一般n取得都是3的倍数。

    seek()第一个参数指移动的字节数。

    seek()第二个参数指的是从哪个位置进行偏移。取值可以是0,1,2。默认是0。

    0:指相对开头偏移

    1:指相对本身位置进行偏移

    2:指相对结尾偏移

    开头:seek(0)

    结尾:seek(0, 2)

  2. tell():帮助我们获取当前光标位置,返回的值也是以字节为单位进行度量的。

  3. truncate():截断文件

     

# 文件修改 import os  with open("file/dog", mode="r", encoding="utf-8") as f1, open("file/dog_new", mode="w", encoding="utf-8") as f2:     for line in f1:         line_new = line.replace("哈", "嘻")         f2.write(line_new)  os.remove("file/dog") os.rename("file/dog_new", "file/dog")     
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!