函数和模块

函数和模块

文件操作相关

文件操作

读文件

  • 读文本文件
# 1.打开文件
#	- 路径:
#		相对路径:'info.txt'
#		绝对路径:'/Users/wupeiqi/PycharmProjects/luffyCourse/day09/info.txt'
# 	- 模式
# 		rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)
# 1.打开文件
file_object = open('info.txt', mode='rb')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()

print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123'
text = data.decode("utf-8")
print(text)

# 1.打开文件
file_object = open('info.txt', mode='rt', encoding='utf-8')

# 2.读取文件内容,并赋值给data
data = file_object.read()

# 3.关闭文件
file_object.close()

print(data)
  • 读图片等非文本内容文件。
file_object = open('a1.png', mode='rb')
data = file_object.read()
file_object.close()

print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...
  • 绝对路径

    # 1.打开文件
    file_object = open('/Users/wupeiqi/PycharmProjects/luffyCourse/day09/info.txt', mode='rt', encoding='utf-8')
    # 2.读取文件内容,并赋值给data
    data = file_object.read()
    # 3.关闭文件
    file_object.close()
    

    windows系统中写绝对路径容易出问题:

    # file_object = open('C:\\new\\info.txt', mode='rt', encoding='utf-8')
    
    file_object = open(r'C:\new\info.txt', mode='rt', encoding='utf-8')
    data = file_object.read()
    file_object.close()
    print(data)
    
  • 读文件时,文件不存在程序会报错。

# 判断路径是否存在?
import os

file_path = "/Users/wupeiqi/PycharmProjects/luffyCourse/day09/info.txt"
exists = os.path.exists(file_path)
if exists:
    # 1.打开文件
    file_object = open('infower.txt', mode='rt', encoding='utf-8')
    # 2.读取文件内容,并赋值给data
    data = file_object.read()
    # 3.关闭文件
    file_object.close()
    print(data)
else:
    print("文件不存在")

写文件

  • 写文本文件

    # 1.打开文件
    # 路径:t1.txt
    # 模式:wb(要求写入的内容需要是字节类型)
    file_object = open("t1.txt", mode='wb')
    
    # 2.写入内容
    file_object.write(    "aaa".encode("utf-8")    )
    
    # 3.文件关闭
    file_object.close()
    
    file_object = open("t1.txt", mode='wt', encoding='utf-8')
    
    file_object.write("aaa")
    
    file_object.close()
    
  • 写图片等文件

    f1 = open('a1.png',mode='rb')
    content = f1.read()
    f1.close()
    
    f2 = open('a2.png',mode='wb')
    f2.write(content)
    f2.close()
    

案例:

# 案例1:用户注册
"""
user = input("请输入用户名:")
pwd = input("请输入密码:")
data = "{}-{}".format(user, pwd)
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
file_object.write(data)
file_object.close()
"""

# 案例2:多用户注册
"""
# w写入文件,先清空文件;再在文件中写入内容。
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
while True:
    user = input("请输入用户名:")
    if user.upper() == "Q":
        break
    pwd = input("请输入密码:")
    data = "{}-{}\n".format(user, pwd)

    file_object.write(data)
file_object.close()
"""

小高级案例:(超前)

利用Python想某个网址发送请求并获取结果(利用第三方的模块)

  • 下载第三方模块

    pip install requests
    
    /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install requests
    
  • 使用第三方模块

    import requests
          
    res = requests.get(url="网址")
    print(res)
    
# 案例1:去网上下载一点文本,文本信息写入文件。
import requests

res = requests.get(
    url="https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20",
    headers={
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
)

# 网络传输的原始二进制信息(bytes)
# res.content

file_object = open('files/log1.txt', mode='wb')
file_object.write(res.content)
file_object.close()



# 案例2:去网上下载一张图片,图片写入本地文件。
import requests

res = requests.get(
    url="https://hbimg.huabanimg.com/c7e1461e4b15735fbe625c4dc85bd19904d96daf6de9fb-tosv1r_fw1200",
    headers={
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
)

# 网络传输的原始二进制信息(bytes)
# res.content

file_object = open('files/美女.png', mode='wb')
file_object.write(res.content)
file_object.close()

文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。

文件打开模式

关于文件的打开模式常见应用有:

  • 只读:rrtrb (用)

    • 存在,读
    • 不存在,报错
  • 只写:wwtwb(用)

    • 存在,清空再写
    • 不存在,创建再写
  • 只写:xxtxb

    • 存在,报错
    • 不存在,创建再写。
  • 只写:aatab【尾部追加】(用)

    • 存在,尾部追加。
    • 不存在,创建再写。
  • 读写

    • r+、rt+、rb+,默认光标位置:起始位置
file_object = open('info.txt', mode='rt+')

# 读取内容
data = file_object.read()
print(data)

# 写入内容
file_object.write("你好呀")

file_object.close()
file_object = open('info.txt', mode='rt+')

# 写入内容
file_object.write("alex")

# 读取内容
data = file_object.read()
print(data)  # -123

file_object.close()
  • w+、wt+、wb+,默认光标位置:起始位置(清空文件)

    file_object = open('info.txt', mode='wt+')
    
    # 读取内容
    data = file_object.read()
    print(data)
    
    # 写入内容
    file_object.write("你好呀")
    
    # 将光标位置重置起始
    file_object.seek(0)
    
    # 读取内容
    data = file_object.read()
    print(data)
    
    file_object.close()
    
  • x+、xt+、xb+,默认光标位置:起始位置(新文件)

  • a+、at+、ab+,默认光标位置:末尾

    file_object = open('info.txt', mode='at+')
    
    # 写入内容
    file_object.write("aaa")
    
    # 将光标位置重置起始
    file_object.seek(0)
    
    # 读取内容
    data = file_object.read()
    print(data)
    
    file_object.close()
    

    常见功能

    在上述对文件的操作中,我们只使用了write和read来对文件进行读写,其实在文件操作中还有很多其他的功能来辅助实现更好的读写文件的内容。

    • read,读

      • 读所有【常用】

        f = open('info.txt', mode='r',encoding='utf-8')
        data = f.read()
        f.close()
        
        f = open('info.txt', mode='rb')
        data = f.read()
        f.close()
        
      • 读n个字符(字节)【会用到】

        f = open('info.txt', mode='r', encoding='utf-8')
        # 读1个字符
        data = f.read(1)
        f.close()
        
        print(data) # 武
        
        f = open('info.txt', mode='r',encoding='utf-8')
        
        # 读1个字符
        chunk1 = f.read(1)
        chunk2 = f.read(2)
        print(chunk1,chunk2)
        
        f.close()
        
        f = open('info.txt', mode='rb')
        
        # 读1个字节
        data = f.read(3)
        f.close()
        
        print(data, type(data))  # b'\xe6\xad\xa6' <class 'bytes'>
        
        f = open('info.txt', mode='rb')
        
        # 读1个字节
        chunk1 = f.read(3)
        chunk2 = f.read(3)
        chunk3 = f.read(1)
        print(chunk1,chunk2,chunk3)
        
        f.close()
        
    • readline,读一行

      f = open('info.txt', mode='r', encoding='utf-8')
      
      v1 = f.readline()
      print(v1)
      
      v2 = f.readline()
      print(v2)
      
      f.close()
      
      f = open('info.txt', mode='r', encoding='utf-8')
      v1 = f.readline()
      print(v1)
      f.close()
      
      f = open('info.txt', mode='r', encoding='utf-8')
      v2 = f.readline()
      print(v2)
      f.close()
      
    • readlines,读所有行,每行作为列表的一个元素

      f = open('info.txt', mode='rb')
      
      data_list = f.readlines()
      
      f.close()
      
      print(data_list)
      
    • 循环,读大文件(readline加强版)【常见】

      f = open('info.txt', mode='r', encoding='utf-8')
      for line in f:
          print(line.strip())
      f.close()
      
    • write,写

      f = open('info.txt', mode='a',encoding='utf-8')
      f.write("aaa")
      f.close()
      
      f = open('info.txt', mode='ab')
      f.write( "aaa".encode("utf-8") )
      f.close()
      
    • flush,刷到硬盘

      f = open('info.txt', mode='a',encoding='utf-8')
      
      while True:
          # 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
      	f.write("aaa")
          f.flush()
      
      f.close()
      
      file_object = open('files/account.txt', mode='a')
      
      while True:
          user = input("用户名:")
          if user.upper() == "Q":
              break
          pwd = input("密码:")
          data = "{}-{}\n".format(user, pwd)
          file_object.write(data)
          file_object.flush()
      
      file_object.close()
      
    • 移动光标位置(字节)

      f = open('info.txt', mode='r+', encoding='utf-8')
      
      # 移动到指定字节的位置
      f.seek(3)
      f.write("aaa")
      
      f.close()
      

      注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。

    • 获取当前光标位置

      f = open('info.txt', mode='r', encoding='utf-8')
      
      p1 = f.tell()
      print(p1)  # 0
      
      f.read(3)  # 读3个字符 3*3=9字节
      
      p2 = f.tell()
      print(p2)  # 9
      
      f.close()
      
      f = open('info.txt', mode='rb')
      
      p1 = f.tell()
      print(p1)  # 0
      
      f.read(3)  # 读3个字节
      
      p2 = f.tell()
      print(p2)  # 3
      
      f.close()
      
posted @ 2025-06-15 20:34  funji  阅读(26)  评论(0)    收藏  举报