Python基础语法文章导航:
- Python基础(01初识数据类型&变量)
- Python基础(02条件&循环语句)
- Python基础(03字符串格式化&运算符&进制&编码)
- Python基础(04 基础练习题)
- Python数据类型(day05整型&布尔类型&字符串类型)
- Python数据类型(06列表&元组)
- Python数据类型(07集合&字典&浮点型&None)
目录
一.文件操作
1.读文件
(1)读文本文件
读文本内容可以采取2中方式:rb和rt。
# 1.打开文件
# - 路径:
# 相对路径:'info.txt'
# 绝对路径:'C:\Users\W\Desktop\mashibing\project\ceshi_untils\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") #小彭在努力学习ing
print(text)
file_object=open('info.txt',mode='rt',encoding='utf-8')
data=file_object.read()
file_object.close()
print(data)
(2)读图片等非文本内容文件
读图片可以采取rb方式,读出来的结果是二进制的形式。
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\...
(3)判断路径是否存在
读文件时,文件不存在会报错,所以在读文件之前需要对文件是否真实存在进行判断。
# 判断路径是否存在?
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("文件不存在")
(4)绝对路径问题
# MAC系统绝对路径书写形式
#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)
2.写文件
注意:文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。这一点是与读文件发现文件不存在抛出异常的逻辑是不一样的。
(1)写文本文件
写文本内容可以采取2中方式:rb和rt。
file_object = open('C:\\Users\\W\\Desktop\\mashibing\\project\\ceshi_untils\\info.txt', mode='wb')
content=file_object.write("吴佩琦".encode('utf-8'))
file_object.close()
print(content)
file_object = open("info.txt", mode='wt', encoding='utf-8')
file_object.write("xiao萍")
file_object.close()
(2)写图片等非文本文件
写图片可以采取的步骤:先用rb模式读出原图片的二进制形式,然后再用wb把读的二进制写到新的图片里面去,实现图片的copy。
f1 = open('a1.png',mode='rb')
content = f1.read()
f1.close()
f2 = open('a2.png',mode='wb')
f2.write(content)
f2.close()
3.文件打开模式
关于文件的打开模式常见应用有:
只读:
r
、rt
、rb
(用)
存在,读
不存在,报错
只写:
w
、wt
、wb
(用)
存在,清空再写
不存在,创建再写
只写:
x
、xt
、xb
存在,报错
不存在,创建再写。
只写:
a
、at
、ab
【尾部追加】(用)
存在,尾部追加。
不存在,创建再写。
读写
r+、rt+、rb+,默认光标位置:起始位置
#1.先读后写,从位置0开始读,读完从读完的末尾的位置开始写进去数字 file_object = open('info.txt', mode='rt+') # 读取内容 data = file_object.read() print(data) #123 # 写入内容 file_object.write("你好呀") #123你好呀 file_object.close() #2.先写后读,从位置0开始写覆盖之前的字符串,写完从写完的末尾的位置开始读数字 file_object = open('info.txt', mode='rt+') #1234567 # 写入内容 file_object.write("alex") #alex567 # 读取内容 data = file_object.read() print(data) #alex567 file_object.close()
w+、wt+、wb+,默认光标位置:起始位置(清空文件)
# 注意:文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。 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("武沛齐") # 将光标位置重置起始 file_object.seek(0) # 读取内容 data = file_object.read() print(data) #你好呀武沛齐 file_object.close()
4.常见功能
(1)read()
read():读所有
f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()
(2)read(n)
read(n): 读n个字符(字节)
f = open('info.txt', mode='r',encoding='utf-8') #123
# 读1个字符
chunk1 = f.read(1) #1
chunk2 = f.read(2) #23
print(chunk1,chunk2)
f.close()
(3)readline()
#每次读一行
#123
#456
f = open('info.txt', mode='r', encoding='utf-8')
v1 = f.readline()
print(v1) #123
v2 = f.readline()
print(v2) #456
f.close()
(4)readlines()
读所有行,每行作为列表的一个元素。
f = open('info.txt', mode='rb')
data_list = f.readlines()
f.close()
print(data_list)
#[b'\xc4\xe3\xba\xc3\xd1\xbd\xce\xe4\xc5\xe6\xc6\xeb\r\n', b'123\r\n', b'3333\r\n', b'456\r\n', b'789']
for循环,读出每行的数据,并输出。
f = open('info.txt', mode='r', encoding='utf-8')
for line in f:
print(line.strip())
f.close()
(5)write()
(6)flush()
f = open('info.txt', mode='a',encoding='utf-8')
while True:
# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
f.write("武沛齐")
f.flush()
f.close()
(7)seek()
移动光标位置(字节)。注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
f = open('info.txt', mode='r+', encoding='utf-8')
# 移动到指定字节的位置
f.seek(3)
f.write("武沛齐")
f.close()
(8)tell()
获取当前光标位置。
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()
5.上下文管理
之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
以后再进行文件操作时,推荐使用with上下文管理,它可以自动实现关闭文件。
with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
data1 = f1.read()
data2 = f2.read()
print(data1)
print(data2)
二.csv格式文件
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。对于这种格式的数据,我们需要利用open函数来读取文件并根据逗号分隔的特点来进行处理。
练习题案例:下载文档中的所有图片且以用户名为图片名称存储。
ID,用户名,头像
26044585,Hush,https://hbimg.huabanimg.com/51d46dc32abe7ac7f83b94c67bb88cacc46869954f478-aP4Q3V
19318369,柒十一,https://hbimg.huabanimg.com/703fdb063bdc37b11033ef794f9b3a7adfa01fd21a6d1-wTFbnO
15529690,Law344,https://hbimg.huabanimg.com/b438d8c61ed2abf50ca94e00f257ca7a223e3b364b471-xrzoQd
18311394,Jennah·,https://hbimg.huabanimg.com/4edba1ed6a71797f52355aa1de5af961b85bf824cb71-px1nZz
import os
import requests
with open('files/mv.csv', mode='r', encoding='utf-8') as file_object:
file_object.readline()
for line in file_object:
user_id, username, url = line.strip().split(',')
print(username, url)
# 1.根据URL下载图片
res = requests.get(
url=url,
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"
}
)
# 检查images目录是否存在?不存在,则创建images目录
if not os.path.exists("images"):
# 创建images目录
os.makedirs("images")
# 2.将图片的内容写入到文件
with open("images/{}.png".format(username), mode='wb') as img_object:
img_object.write(res.content)
三.ini格式文件
ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=py-mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
[client]
default-character-set=utf8
import configparser
config = configparser.ConfigParser()
config.read('files/my.ini', encoding='utf-8')
# config.read('/Users/wupeiqi/PycharmProjects/luffyCourse/day09/files/my.ini', encoding='utf-8')
# 1.获取所有的节点
result = config.sections()
print(result) # ['mysqld', 'mysqld_safe', 'client']
# 2.获取节点下的键值
result = config.items("mysqld_safe")
print(result) # [('log-error', '/var/log/mariadb/mariadb.log'), ('pid-file', '/var/run/mariadb/mariadb.pid')]
for key, value in config.items("mysqld_safe"):
print(key, value)
# 3.获取某个节点下的键对应的值
result = config.get("mysqld","collation-server")
print(result)
# 4.其他
# 4.1 是否存在节点
v1 = config.has_section("client")
print(v1)
# 4.2 添加一个节点
config.add_section("group")
config.set('group','name','wupeiqi')
config.set('client','name','wupeiqi')
config.write(open('files/new.ini', mode='w', encoding='utf-8'))
# 4.3 # 删除节点
config.remove_section('client')
# 删除节点中的键值
config.remove_option("mysqld", "datadir")
config.write(open('files/new.ini', mode='w', encoding='utf-8'))
总结:
以上为文件
相关的操作的部分内容只需要理解即可,后续开发时会调用文件相关操作就可以。