【笔记】《Python语言以及应用》- 数据操作

字符串:Unicode字符组成的序列
字节和字节数组:8 byte组成的序列

1. 编码和解码

编码:将Unicode字符串转化为一系列字节的过程

# str类型
snowman = '\u2603'
len(snowman)  # 1 只包含一个Unicode字符串,与所存储的字节数无关

# bytes类型
ds = snowman.encode('utf-8')  # b'\xe2\x98\x83'
len(ds) # 3 占据3个字节的空间
# encode(encoding='utf-8', errors='strict') -> bytes
# 第一个参数为编码方式,第二个参数为编码异常的处理

# strict, 出错时抛出UnicodeEncodeError错误

# ignore, 抛弃无法编码的字符
snowman = 'abc\u2603'
ds = snowman.encode('ascii', 'ignore')
print(ds) # b'abc'
print(len(ds))  # 3

# replace, 将无法编码的字符替换为?
snowman = 'abc\u2603'
ds = snowman.encode('ascii', 'replace')
print(ds) # b'abc?'
print(len(ds))  # 4

# backslashreplace, 将无法编码的字符转为\\u这种形式
snowman = 'abc\u2603'
ds = snowman.encode('ascii', 'backslashreplace')
print(ds) # b'abc\\u2603'
print(len(ds))  # 9

# xmlcharrefreplace, 将无法编码的字符转为字符串实体
snowman = 'abc\u2603'
ds = snowman.encode('ascii', 'xmlcharrefreplace')
print(ds) # b'abc☃'
print(len(ds))  # 10

解码:将字节序列转化为Unicode字符串的过程(注意编码和解码的格式必须一致,如都用utf-8,否则会得不到预期的值)

place = 'caf\u00e9'
place_bytes = place.encode('utf-8') # b'caf\xc3\xa9'
place2 = place_bytes.decode('utf-8')  # café

2. 格式化

旧的格式化:%
新的格式化:{}format

n = 42
f = 7.03
s = 'string cheese'

print('{} {} {}'.format(n, f, s)) # 默认
print('{2} {0} {1}'.format(f, s, n))  # 位置索引
print('{n} {f} {s}'.format(n=n, f=f, s=s))  # 关键字

d = {'n': n, 'f': f, 's': s}
print('{0[n]} {0[f]} {0[s]} {1}'.format(d, 'other'))  # 字典

print('{0:5d} {1:10f} {2:20s}'.format(n, f, s)) # 默认左对齐
print('{0:>5d} {1:>10f} {2:>20s}'.format(n, f, s))  # 左对齐
print('{0:<5d} {1:<10f} {2:<20s}'.format(n, f, s))  # 右对齐
print('{0:^5d} {1:^10f} {2:^20s}'.format(n, f, s))  # 居中对齐
print('{0:!^5d} {1:#^10f} {2:&^20s}'.format(n, f, s)) # 占位
print('{0:!^5d} {1:#^10.4f} {2:&^20.4s}'.format(n, f, s)) # 精度

3. 正则表达式

match检查是否以...开头

import re

source = 'Young man'
m = re.match('You', source)
if m:
  print(m.group())  # You

search返回第一次匹配成功的项

import re

source = 'Young man'
m = re.search('man', source)
if m:
  print(m.group())  # man

m1 = re.match('.*man', source)
if m1:
  print(m1.group())  # Young man

findall返回所有匹配项

import re

source = 'Young man'
m = re.findall('n.?', source)
print(m)  # ['ng', 'n'],没有就返回[]

split类似于字符串的split,只不过这里是模式而不是文本

import re

source = 'Young man'
m = re.split('n', source)
print(m)  # ['You', 'g ma', '']

sub替换匹配,类似于字符串的replace, 只不过这里是模式而不是文本

import re

source = 'Young man'
m = re.sub('n', '?', source)
print(m)  # You?g ma?
模式 匹配
. 任意一个除\n外的字符
* 任意多个字符(包括0个)
+ 一个或多个字符
? 可选字符(0个或1个)
\d 一个数字字符
\w 一个字母或数字或下划线字符
\s 空白符
\b 单词边界

特殊字符:

模式 匹配
. 任意一个除\n外的字符
* 任意多个字符(包括0个)
+ 一个或多个字符
? 可选字符(0个或1个)
\d 一个数字字符
\w 一个字母或数字或下划线字符
\s 空白符
\b 单词边界
import string
import re

printable = string.printable

re.findall('\d', printable) # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

re.findall('\s', printable) # [' ', '\t', '\n', '\r', '\x0b', '\x0c']

定义匹配的输出

m.groups()获得匹配的元组

import re

source = 'a dish of fish tonight.'

m = re.search(r'(. dish\b).*(\bfish)', source)
print(m.group())  # a dish of fish
print(m.groups()) # ('a dish', 'fish')

(?P<name>expr)匹配expr,并将结果存储在名为name的组中

import re

source = 'a dish of fish tonight.'

m = re.search(r'(?P<DISH>. dish\b).*(?P<FISH>\bfish)', source)
print(m.group())   # a dish of fish
print(m.group('DISH'))  # a dish
print(m.group('FISH'))  # fish
print(m.groups()) # ('a dish', 'fish')

4. 读写文件

open(filename, mode)
其中mode的第一个字母表明对文件的操作:

  • r表示读模式
  • w表示写模式(若文件不存在,则新创建;若存在则重写新内容)
  • x表示文件不存在的情况下新创建并写文件
  • a表示如果文件存在,在文件末尾追加写内容

第二个字母:

  • t文本类型(默认)
  • b二进制文件

使用write()写文件:

poem = '''
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
'''

with open('a.txt', 'wt', encoding='utf-8') as fout:
  fout.write(poem)


# 数据分块
with open('a.txt', 'wt', encoding='utf-8') as fout:
  size = len(poem)
  offset = 0
  chunk = 100
  while True:
    if offset > size:
      break
    fout.write(poem[offset:offset+chunk])
    offset += chunk

# 避免重写
try:
  with open('a.txt', 'xt', encoding='utf-8') as fout:
    fout.write(poem)
except FileExistsError:
  print('文件已经存在')

使用read()、readline()、readlines()读文件:

with open('a.txt', 'rt', encoding='utf-8') as fin:
  poem = fin.read()

# 每次读一行
with open('a.txt', 'rt', encoding='utf-8') as fin:
  poem = ''
  while True:
    line = fin.readline()
    if not line:
      break
    poem += line

# 使用迭代器
with open('a.txt', 'rt', encoding='utf-8') as fin:
  poem = ''
  for line in fin:
    poem += line

# 读入所有行,返回单行字符串的列表
with open('a.txt', 'rt', encoding='utf-8') as fin:
  lines = fin.readlines()
# 输出 ['\n', '床前明月光,\n', '疑是地上霜。\n', '举头望明月,\n', '低头思故乡。\n']

tell()返回文件此刻的字节偏移量,seek(n)跳到文件字节偏移量为n的位置:

seek(offset, origin)

origin=0(默认), 从开头偏移offset个字节
origin=1, 从当前位置偏移offset个字节
origin=2, 距离最后结尾处偏移offset个字节

with open('b', 'rb') as fin:
  print(fin.tell())   # 从0开始
  fin.seek(254, 0)    # 跳到254(返回最后两个字节)
  print(fin.tell())   # 254
  fin.seek(1, 1)      # 在此基础上前进一个字节
  print(fin.tell())   # 255
  data = fin.read()   # 一直读到文件结尾 b'\xff'

print(data[0])  # 255
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容