pythom默认编码格式是gbk,在pycharm里面写代码是gbk形式,相应也要用gbk的编码转成文本,外面导入pycharm使用utf-8。
CSV文件
1.什么是CSV?
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
- 什么是CSV文件 ?
CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
通常都是纯文本文件txt,也可以excel表格打开识别。
3.python中的CSV模块
import csv
dir(csv) #查看模块下的方法
4.csv文件的写入操作
import csv
#使用数字和字符串的数字都可以
stus=[
['姓名','年龄','性别'],
['张三',14,'男'],
['李四',23,'女'],
['王五',18,'女'],
['郑六',20,'男'],
] #使用二维列表
with open('stuMESS.csv','w',newline='',encoding='utf-8') as f:
wr=csv.writer(f)
for s in stus: #s遍历二维列表里面的每一个一维列表
wr.writerow(s) #writerow控制换行
#上面的for语句课直接写做:wr.writerows(stus)
#入创建CSV文件时没有指定newline='',则每写入一行将有一空行被写入
5.csv文件的读取操作
import csv
with open('stuMESS.csv',encoding='gbk') as f:
rd=csv.reader(f)
stus=list(rd)
print('一次性打印')
print(stus)
print('\n逐行打印')
for row in stus:
print(row)
6.DictReader和DictWriter
使用DictWriter类,可以写入字典形式的数据,同样键也是标头(表格第一行)。
使用DictReader可以像操作字典那样获取数据,把表的第一行(一般是标头)作为key。可访问每一行中那个某个key对应的数据。
7.用字典形式写csv文件和二维列表写一样
import csv
#使用数字和字符串的数字都可以
headers=['姓名','年龄','性别']
stus= [
{'姓名':'张三','年龄':14,'性别':'男'},
{'姓名':'李四','年龄':23,'性别':'女'},
{'姓名':'王五','年龄':18,'性别':'女'},
{'姓名':'郑六','年龄':20,'性别':'男'}
]
with open('stuDICT.csv','w',newline='',encoding='gbk') as f:
wr=csv.DictWriter(f,headers) #f是文件对象,header是键对象
wr.writeheader()#把键写进去
wr.writerows(stus)#把字典内容写进去
8.使用reader函数,接收一个可迭代的对象(比如csv文件),能返回一个生成器,就可以从其中解析出csv的内容:比如下面的代码可以读取csv的全部内容,以行为单位
import csv
with open('stuDICT.csv') as f:
rd=csv.reader(f)
for row in rd:
print(row)
9.使用DictReader,和reader函数类似,接收一个可迭代的对象,能返回一个生成器,但是返回的每一个单元格都放在一个字典的值内,而这个字典的键则是这个单元格的标题(即列头)。
OrderedDict:有序字典,根据放入元素的先后顺序进行字典内容的排序
import csv
with open('stuDICT.csv') as f:
rd=csv.DictReader(f)
for row in rd:
print(row)
print('\n再次打开,只读姓名出来')
with open('stuDICT.csv') as f:
rd=csv.DictReader(f)
names=[]
for row in rd:
names.append(row['姓名'])
print(names)
10.统计文件‘关于python.txt’ 中所有字符(空格、制表符和换行符不用统计)出现的次数,采用“字符:次数”的方式表示,以CSV方式存储在“python字符统计.txt”文件中。
with open('关于python.txt','r',encoding='utf-8') as f:
s=f.read()#读取的文本内容存储到变量s里面
d={}#创建一个空字典
for c in s:
if c not in d:
d[c]=1
else:
d[c]+=1
#d[c]=d.get(c,0)+1
#d.get(c,0)是从字典d中去除键为C的值,如果没有这个键,则返回0
del d[' ']#删除空格
#del d['\t']#删除制表符 可能是txt文本没有制表符
del d['\n']#删除换行符
mess=''
for key in d:
mess+=key+':'+str(d[key])+',' #以键:值的形式表现
mess=mess[0:len(mess)-1]
with open('python字符统计.txt','w',encoding='utf-8') as f:
f.write(mess)
11.
'''
import csv
with open('5班学生信息.txt','r') as f:
s=f.read() #读进字符
print(s)
with open('5班学生信息.csv','w',encoding='gbk') as f:
w=f.write(s)
print(w)
'''
import csv
with open('5班学生信息.txt') as fr:
lines=fr.readlines() #读进来存储成一个列表
with open('5班学生信息.csv','w',newline='') as fw:
wr=csv.writer(fw) #创建writer对象,使用于列表,Dictreader用于字典
header=['学号','姓名','性别','年龄','联系方式']#写进去是一个一维列表
wr.writerow(header)
for line in lines:
curr=line.strip().split(',')#对于当前行,去掉末行的换行符再做切割,curr是一个列表
if curr:
wr.writerow(curr)
12.import csv
print('5班年龄为19岁的学生信息如下:')
print('%-6s%-6s%-6s'%('姓名','年龄','性别'))
with open('5班学生信息.csv','r') as f:
rd=csv.DictReader(f)
for row in rd:
if int(row['年龄'])==19:
print('%-6s%-8s%-6s'%(row['姓名'],row['年龄'],row['性别']))
13.小明已经有了几项热爱的体育运动在sportsList中,现在请你添加上“网球”和“羽毛球”,去掉“冰球”
sportsList=['跑步','爬山','游泳','冰球','击剑']
sportsList.extend(['网球','羽毛球'])
sportsList.remove('冰球')
print(sportsList )
13.请补充横线处的代码,读入正整数n和m,生成m个1到1000之间的随机整数,显示这些随机数中能被n整除的数字
import random
n=int(input('请输入除数(int): '))
m=int(input('请输入随机数的个数(int): '))
t=[] #因为下面使用了列表的append方法
for i in range(m):
t.append(random.randint(1,1000))
print('这些随机数是',t)
ok=[]
for i in t:
if i%n==0:
ok.append(i)
if not ok:
print('没找到合适的随机数')
else:
print('能整除的数有',ok)
15.'''
已知“汽车报价信息.csv”中存放有汽车产品型号及其报价范围,
从文件中读取出来,并根据用户要选择的型号或者价格范围打印出相关信息。
'''
import csv
type=input('你想要查找的型号是,如果无要求则直接回车: ')
s=input('你的接受价格(单位:万)是 ,如果无要求则直接回车: ')
if s:
price=int(s)
else:
price=0
with open('汽车报价信息.csv') as f:
rd=csv.DictReader(f)
for row in rd:
xinghao=row['型号'] #获取汽车型号
minPrice=int(row['最低报价']) #获取最低报价
maxPrice=int(row['最高报价']) #获取最高报价
if (type=='无' or type in xinghao) and \
(price==0 or minPrice<=price<=maxPrice):
print(xinghao,minPrice,maxPrice)
print('查找结束!')
jieba模块
什么是jieba(二级考证必选库): Python中的第三方中文分词扩展库,支持三种分词模式:
1)精确模式:适合文本分析
2)全模式:速度快,但不能解决歧义
3)搜索引擎模式,适用于搜索引擎分词
Jieba中的主要函数:
1)jieba.lcut(x):精确模式,返回中文文本x分词后的x变量
2)jieba.lcut(x, cut_all=True) :全模式,返回中文文本x分词后的x变量
3)jieba.lcut_for_search(x):搜索引擎模式,返回…..
4)jieba.add_word(w):向分词词典中添加新词w,其中w为中文词组
import jieba
s=jieba.lcut('中国人民终于站起来了,反抗帝国主义的入侵')
print(s)
jieba.add_word('站起来') #精准切法
s=jieba.lcut('中国人民终于站起来了,反抗帝国主义的入侵')
print(s)
1.统计文件‘关于python.txt’ 中所有词语出现的次数,采用“词语:次数”的方式表示,以CSV方式存储在“python词语统计.txt”文件中。
'''
统计文件‘关于python.txt’ 中所有词语出现的次数,采用“词语:次数”的方式表示,
以CSV方式存储在“python词语统计.txt”文件中。
import jieba
with open('关于python.txt','r') as f:
s=f.read()
words=jieba.lcut(s)
d={}
for c in words:
if c not in (' ','\t','\n'):
d[c]=d.get(c,0)+1
#d.get(c,0)是从字典d中取出键为c的值,如果没有这个键,则返回0
mess=[]
for key in d:
mess.append("{}:{}".format(key,d[key]))
with open('python词语统计1.txt','w',encoding='utf-8') as f:
f.write(','.join(mess))
二进制文件的读写流程
1)使用open()以某个指定的模式加’b’打开文件
2)以该模式操作文件存取的都是字节,也就是bytes或者bitearray,而不是字符
例如:
f.write(b’hello’):将字符串“hello”转换成字节数据再写入文件中
f.read(n):从文件中读入至多n个字节,返回一个bytes对象
3)关闭文件f.close(),在没有使用with语句下
1.查看字节码。
#123.txt
hi, sun
中午好
hi, stars
filename=input('请输入二进制文件的名称: ')
with open(filename,'rb') as f:
index=0 #用来下面统计换行
while True:
temp = f.read(1)#每次读一个字节进来
if len(temp) ==0:#如果读到的字节为0,说明文件到达尾部
break #出去
else:
print('%3s' % temp,end='')#显示当前字节,显示内容
index=index+1#行内字数+1
if index ==10:#这里换行,每行打印10个字节就换行
index=0#重置
print()
输入的二进制文件也可以是图片.png形式
2.二进制文件的随机访问 文件的读取和写入一般是从当前位置(打开文件时位置是0)操作到文件的结尾(EOF),即按顺序进行访问。
文件对象也支持seek()方法,它通过字节偏移量将读取/写入位置移动到文件中的任意位置,从而实现文件的随机访问。
具体语法如下: f.seek(offset[, whence])
说明:offset -- 开始的偏移量,也就是代表需要移动偏移的字节数;
whence:可选,默认值为 0,表示要从哪个位置开始偏移;其值可以是os.SEEK_SET、os.SEEK_CUR、os.SEEK_END,也可以用0、1、2表示,其意义分别是:0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
3.二进制文件的随机定位
from os import SEEK_END #定向导入模块成员的方法,可以减轻代码负重
with open('ran.txt','w+b') as f: #w+模式的运作
#写入文件
f.write(b'hi,Sum\n')
f.write(b'hi,python\n')
f.write(b'hi,morning\n')
#随机读取文件的指定位置信息
print('\n当前文件内容是: ')
f.seek(0)#文件的索引从零开始
content=f.read()
print(content) #用content变量接受
print('文件长度是',len(content))
print()
f.seek(3)#去到3号位
print('当前位置是',f.tell())#显示当前存取的位置
print('读3个字节:',f.read(3))
print('当前位置是', f.tell()) # 显示当前存取的位置
print('读4个字节:', f.read(4))
f.seek(-8,SEEK_END)#os.SEEK_END表示结尾,也可以写成2
print('当前位置是', f.tell()) # 显示当前存取的位置
print('读8个字节:', f.read(8))
#下面是修改文件
f.seek(0)#回到零号位
f.write(b'afternoon')
print('\n修改后的内容是\n')
f.seek(0)#定位到文件开始
content=f.read()
print(content)
print('文件的长度是',len(content))