Python | 文件操作(读、写)
在计算机中,所有的信息,包括图片、文件、程序等,都被表示为二进制数据。
二进制是一种数字系统,只有两个数字0和1,用于表示信息的两种状态。
计算机之所以使用二进制的原因是因为它可以很容易地被物理设备实现,二进制数的简单性和可操作性也使得计算机能够快速地处理信息。
1.1 读文件
- 读文本文件
- 读图片等非文本文件
# 1.打开文件
# 第一个参数可以是相对路径,也可以是绝对路径
# mode 读取文件的类型,rb表示二进制
file_object = open('info.txt', mode='rb')
# 2. 读取文件的内容,并赋值给data
data = file_object.read()
# 3. 关闭文件
file_object.close()
print(data)
# 打印出来的是文件内原文的二进制类型
# b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc...'
# 将文本的内容由 二进制字节类型,转换为 utf-8 字符串类型
text = data.decode("utf-8")
print(text)
# 你好,我是无言非影。
非文本文件的类型,一般就直接读取转换后的二进制类型内容。
file_object = open('1.png', mode='rb')
# 2. 读取文件的内容,并赋值给data
data = file_object.read()
# 3. 关闭文件
file_object.close()
print(data)
# b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00:\x00\x...'
每次读取文本文件的时候,都需要手动使用 decode
内置方法使用起来会很不方便。
- 只读文本模式
# 参数 mode 表示文件的打开模式,'rt' 表示只读文本模式(Read Text)。
# 参数 encoding 表示文件的编码方式,'utf-8' 表示使用 UTF-8 编码。
file_object = open('info.txt', mode='rt', encoding='utf-8')
# 读取整个文件的内容
data = file_object.read()
# 关闭文件
file_object.close()
print(data)
# 你好,我是无言非影。
注意:
-
路径
- 绝对路径(需要确定程序在哪里执行的)
- 相对路径
-
读文件的时候,文件不存在,程序会报错
-
可以使用 python 内置函数判断路径是否存在
# 判断路径是否存在 import os exists = os.path.exists('info.txt') print(exists) # True no_exists = os.path.exists('info123.txt') print(no_exists) # False
-
1.2 写文件
-
写文本文件
-
mode='wb'
表示指定文件内容是以二进制写入,需要将写入的内容通过.encode('utf-8')
转换为文本可是 -
file_object = open('writeTest.txt', mode='wb') file_object.write('wuyanfeiying'.encode('utf-8')) file_object.close() # 可以简化为 # mode='wt' 表示使用 'wt' 表示文本写入模式。
-
可以简化为:
-
mode=‘wt’ 表示使用 ‘wt’ 表示文本写入模式
-
file_object = open('writeTest.txt', mode='wt') file_object.write('wuyanfeiying2') file_object.close()
-
-
写图片等非文本文件
-
例子:复制图片
-
# 打开二进制文件 'sgs_1.jpg' 以二进制读取模式 f1 = open('sgs_1.jpg', mode='rb') # 读取打开的二进制文件的全部内容,并存储在变量 'content' 中 content = f1.read() # 关闭已打开的文件。 f1.close() # 以二进制写入模式打开文件 'sgs_2.jpg' f2 = open('sgs_2.jpg', mode='wb') # 将之前从 'sgs_1.jpg' 读取的内容写入 'sgs_2.jpg' 文件 f2.write(content) # 闭已打开的写入文件 'sgs_2.jpg' f2.close()
-
练习1
- 用户注册
让用户输入用户名和密码,之后写入
files
文件夹下的info.txt
文件中
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
- 多用户注册
while True:
user = input("请输入用户名(输入q/Q退出):")
if user.upper() == 'Q':
break
pwd = input("请输入密码:")
data = "{}-{}".format(user, pwd)
file_object = open('files/info.txt', mode='wt', encoding='utf-8')
file_object.write(data)
file_object.close()
出现问题:文件只更新最新的一条数据
原因:使用 w
模式 写入文件的时候,会先清空文件,再在文件中写入内容。
解决方案:只打开文件一次,写入一次即可。
修改后:
file_object = open('files/info.txt', mode='wt', encoding='utf-8')
while True:
user = input("请输入用户名(输入q/Q退出):")
if user.upper() == 'Q':
break
pwd = input("请输入密码:")
data = "{}-{}\n".format(user, pwd) # 加入换行符
file_object.write(data)
file_object.close()
练习3
利用python取获取某个网址的发送请求并获取结果,需要利用到第三方的模块。
- 下载第三方模块
pip install requests
- 使用第三方模块
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..."
}
)
print(res.content)
res.content
获取的是 网络传输的原始的二进制信息
以二进制格式存储获取到的数据保存在 log1.txt中。
file_object = open('files/logo1.txt', mode='wb')
file_object.write(res.content)
file_object.close()
练习4
从网上下载一张图片,文本信息写入文件。
import requests
res = requests.get(url="https://gd-hbimg.huaban.com/702dc8151dd594c701672d3141bb588aa38bbd7462ff-cHlM9F_fw1200",
headers={
"User-Agent": "Mozilla/5.0...."
}
)
print(res.content)
file_object = open('files/fw1200.jpg', mode='wb')
file_object.write(res.content)
file_object.close()
"User-Agent"
需要填写自己浏览器访问的信息。