简图记录-python基础(三)格式化输出,文件操作,正则表达式

一、格式化输出

1、字符串字面值格式化转换

在一个字符串前追加f或者F,然后可以在字符串中使用{XXX}表示 表达式XXX 的字符输出
调用字符串的format方法,可以通过{格式化指令},对format参数进行格式化控制输出,类似C的printf

a = 'good'
b = 'boy'
c = 1.20
print (f'this is a {a:10} {b} {c}') #输出 this is a good       boy 1.2
print ('i am a {:2} {:.2%}'.format(a, c)) #输出i am a good 120.00%
#符号输出 带符号保留小数点后两位{:+.2f}
#小数位控制 保留小数点后两位{:.2f} 
#对齐与填充字符 占10个字符位右对齐 {:10d} 左对齐填充x{:x<10d} 中间对齐{:^10d} 
#按进制输出 2进制 {:b} 10进制 {:d} 进制8 {:o} 16进制 {:x} 16进制并添加前缀0x{:#x}
#指数输出 指数记法保留2个小数位 {:.2e}	
2 print方法格式化输出

print为格式化输出方法,其基本定义入下:
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)。将 objects (输出对象,多个对象需用,分割)打印到 file 指定的文本流(sys.stdout为控制台输出),以 sep(默认空格)分隔并在末尾加上 end。 sep, end, file 和 flush 如果存在,它们必须以关键字参数的形式给出。

print ('hello','world','haha''!') # 输出 hello world haha!
a = 123
b = 'good boy'
print (a, b, sep='.') # 输出 123.good boy
for x in range(0, 5):
    print(x, end=',') # (尾部换行变为,)输出 0,1,2,3,4,

针对数字,print可以通过%c %d %f %e %u % o %x控制输出格式和制式,也能通过如%5.2f控制占位与精度
如果输出%s 默认会将参数转化位字符串,类似str(),同样的字符串也能控制占位 对齐方向,同时可以和format方法和f格式组合使用。

#数字格式化输出
# %c输出ASCII码 %s字符串 %d整型 %f浮点数 %e科学计数 
# %u无符号 %o八进制 %x十六进制 
# %010d十进制右对齐占10位不足补0
num = 123
num2 = 321
print ('num  = %d %010d' %(num, num)) # 输出 num  = 123 0000000123
print ('num  = %c' %num) # 输出 num  = {
print ('num  = %s' %num) # 输出 num  = 123
print ('num  = %f %.2f' %(num, num)) # 输出 num  = 123.000000 123.00
print ('num  = %e num2 = %x' %(num, num2)) # 输出 num  = 1.230000e+02 num2 = 141

#字符串的格式化输出(可与format方法,f语句 组合)
# %s标准输出 %.2截取2个字符 %10.2s截取2字符占10位
str1 = 'hello'
print('str = %s' %str1) #输出 str = hello
print('str = %10.2s' %str1) #输出 str =         he
print('str = %-10s' %str1) #输出 str = hello    
print('姓名是:{0:*^4}年龄是:{1:>5}'.format('Tom',20)) #输出 姓名是:Tom*年龄是:   20

二、文件操作

1、基本文件的读写操作

python的文件基本操作是通过open获取文件对象,然后使用文件对象的方法进行读写。
(1)打开文件 获取文件对象 :f = open(filename, mode);
mode用来描述使用文件的方式,r只读, w只写(以前写的数据被覆盖掉), a追加写,r+表示读写,b表按二进制打开(文件默认是按文本)。默认按utf-8打开文本文件,可通过 encoding='XXX’制定打开文件的编码方式。通过with语句打开文件,会在不使用文件的时候自动close文件,省略close操作。
(2)文件对象的操作方法:
关闭:f.close()
读取:f.read(size)按size个byte读取,省略读全部。f.readline()读取一行。f.readlines()按行读取全部内容 返回列表。
写入:f.write(‘XXX’)
读写位置调整:f.tell()返回当前位置,f.seek(offset, pos)控制位置,pos为0文件开头 1当前位置 2文件尾部,省略为0

with open('test.txt','r+') as f: # 创建文件test
	f.write("hello word\n")
	f.write("ha ha ha ha\n")
	print (f.tell()) # 输出 25,当前的位置已经在末尾了
	print (f.read()) # 输出空,当前的位置已经在末尾, read返回空
	f.seek(0, 0) #返回到文件头部
	print (f.read()) # 输出 略(整个文件内容)
	f.seek(0, 0) 
	for line in f.readline():
		print(line) # 按 略(读取第一行内容,每个字符打印一行)
	f.seek(0, 0) 
	for each_line in f.readlines():
		print(each_line) # 按 略(读取每行内容,每行内容打印一行)
2、OS模块 文件系统的操作

通过os模块,可以:
进行当前目录查看getcwd(),目录内容查看listdir 目录切换chdir,创建删除mkdir rmdir。路径递归遍历walk。
文件的重命名rename 文件的删除remove,路径解析path.basename path.dirname path.split等。

#目录的基本操作
print (os.getcwd()) # 打印当前目录,输出 略(当前路径)
os.chdir('D:\\study') # 切换目录
print (os.getcwd()) # 输出 D:\study
print (os.listdir('.')) # 列举当前目录文件名, ..为上一级目录 输出 略
os.mkdir('D:\\study\\test') #创建文件夹(单层)
os.makedirs(r'D:\study\test\a\b') # 递归创建文件夹
os.rmdir('D:\\study\\test\\a\\b') # 删除文件夹(单层)
os.rmdir('D:\\study\\test\\a') # 删除文件夹(单层)
#文件的遍历输出
# root 路径名 (绝对路径)
# dirs 路径下的文件夹名列表(不带路径)
# files 路径下的文件名列表(不带路径)
for root, dirs, files in os.walk('D:\\music\\王力宏'):
	for filename in files:
		print(os.path.join(root,filename))
'''输出类似
D:\music\王力宏\王力宏 - [不可思议]\12 爱无所不在.mp3
D:\music\王力宏\王力宏 - [唯一]\01.唯一.mp3
D:\music\王力宏\王力宏 - [唯一]\02.Last Night.mp3
'''
#文件及其路径的基本操作
os.chdir('D:\\study\\test') # 切换目录
f = open('old.py', 'w') # 创建一个文件
f.close()
os.rename('old.py', 'new.py') #修改文件名
print(os.path.basename('new.py')) # 输出 new.py
print(os.path.dirname('D:\\study\\test\\new.py')) #输出 D:\study\test
tuple_file = os.path.split(r'D:\study\test\new.py') #分开保留 名称和路径
print (tuple_file) # 输出 ('D:\\study\\test', 'new.py')
os.remove('new.py') #删除文件
2、json文件读写操作(保存结构化数据)

read() 方法只能返回字符串,‘123’ 这样的字符串并返回其数字值 123。当你想保存诸如嵌套列表和字典这样更复杂的数据类型时,手动解析和序列化会变得复杂。Python 允许你使用称为 JSON (JavaScript Object Notation) 的流行数据交换格式,而不是让用户不断的编写和调试代码以将复杂的数据类型保存到文件中。

json.dumps() 将 Python 对象编码成 JSON 字符串
json.loads() 将已编码的 JSON 字符串解码为 Python 对象
json.dump() 将Python内置类型序列化为json对象后写入文件
json.load() 读取文件中json形式的字符串元素转化为Python类型

import json as js
obj = [{'aa': 1, 'bb': 2, 'cc': 3},
       (1, 2, 3, 4), 'hello world', 0.5, 100, None, True]
tmp = js.dumps(obj) #将 Python 对象编码成 JSON 字符串
x = js.loads(tmp)

print (type(obj)) #输出 <class 'list'>
print (type(tmp)) #输出 <class 'str'>
print (x) #输出 [{'aa': 1, 'bb': 2, 'cc': 3}, [1, 2, 3, 4], 'hello world', 0.5, 100, None, True]
print (type(x)) #输出 <class 'list'>

with open('json_test.txt','w') as f:
	js.dump(obj, f) #将 Python 对象编码成 JSON 字符串
with open('json_test.txt','r') as f:
	print(js.load(f))# 输出 [{'aa': 1, 'bb': 2, 'cc': 3}, [1, 2, 3, 4], 'hello world', 0.5, 100, None, True]

三、正则表达式

1、概念

正则表达式:是一种对文本匹配的逻辑公式,用于指定规则文本内容的搜索、编辑。
许多语言如perl、python、c++、java都有对正则的支持,大量linux工具如grep find awk sed也都支持正则匹配。
python的正则表达式 由模块re支持。(第三方模块regex , 与re 模块兼容, 还提供了更全面的Unicode支持)

2、正则表达式语法

正则表达式有特殊字符功能进行组合,常用的匹配语法如下

(1)单个字符匹配
.  匹配(除去换行符之外)任何字符
[m-n] m字符到n字符中任意一个字符
\s 匹配单个空格(包括tab和\n)-----\S反向匹配之外的字符
\d 匹配0-9数字-----\D反向匹配之外的字符
\w 匹配字母、数字或者下划线-----\W反向匹配之外的字符
(2)重复次数匹配
* 前一个字符必须出连续出现>=0次
+ 前一个字符必须出连续出现>=1次
? 前一个字符必须出连续出现<=1次
{n} {n,} {n,m}前一个字符 连续出现 n次, 至少n次,n到m次
(3)位置匹配
^ 匹配模式必须出现在行首
$ 匹配模式必须出现在行尾
(4)正则表达式组合
A|B 匹配A正则或者B正则中任何一个
(5)转义字符
使用\转义字符可以使用正则语法中特殊字符原本的含义,比如'.'为一个特殊字符,要表达一个'.'只能使用'\.'表示。
(6)非贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。尾部加?表示非贪婪匹配。
3、正则模块re 方法介绍

(1)获取正则对象
compline方法:re.compile(pattern, flags=0)。
返回一个按pattern匹配规则生成的正则对象,可以通过对象方法match(string)去匹配一个字符串

(2)正则匹配
match方法:re.match(pattern, string, flags=0)
从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,那就返回None
成功返回一个匹配对象,否则返回None,返回的匹配对象可以通过group方法输出匹配结果 ,如果在pattern中使用‘(提取目标)’,来将我们想提取的子字符串括起来,返回的n个匹配结果提取目标放在group(1)到group(n)

content = 'Hello 1234567 World'
result = re.match('Hello\s(\d+)\sWorld', content)
print(result.group()) #输出 Hello 1234567 World
print(result.group(1)) #输出 1234567

search方法:re.search(pattern, string, flags=0)
逐个扫描整个字符串并返回第一个成功的匹配。搜索完了还没有找到,那就返回None(match方法字符串必须从头开始匹配,search逐个比较)。

a = 'asdfasf1234567fasdf555fadsfasd1223s'
b = re.search('f(\d+)',a)
print (b.group()) # 输出 f1234567
print (b.group(1)) # 输出 1234567

findall方法:findall(string[, pos[, endpos]])
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表(search方法只返回第一个匹配的结果,findall是返回全部)

a = 'asdfasf1234567fasdf555fadsfasd1223s'
b = re.findall('f(\d+)',a)
print (b) # 输出 ['1234567', '555']

(3)正则匹配替换
sub方法:re.sub(pattern, repl, string, count=0)
将string中符合pattern的字符串替换为repl字符串或者表达式,替换count次(为0比表示全部替换)

content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content) #输出 aKyroiRixLg

(4)flags说明
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 为了增加可读性,忽略空格和’ # ‘后面的注释

部分正则介绍 blog:
https://blog.csdn.net/qq_878799579/article/details/72887612
https://blog.csdn.net/weixin_40907382/article/details/79654372

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值