4.CSV文件和二进制文件

pythom默认编码格式是gbk,在pycharm里面写代码是gbk形式,相应也要用gbk的编码转成文本,外面导入pycharm使用utf-8。

CSV文件

1.什么是CSV?
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

  1. 什么是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)
image.png

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)
image.png

11.
image.png
'''
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.
image.png
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.
image.png
'''
已知“汽车报价信息.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)
image.png

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()

image.png

输入的二进制文件也可以是图片.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))
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。