pythom默認(rèn)編碼格式是gbk,在pycharm里面寫(xiě)代碼是gbk形式跷跪,相應(yīng)也要用gbk的編碼轉(zhuǎn)成文本齐板,外面導(dǎo)入pycharm使用utf-8。
CSV文件
1.什么是CSV橡羞?
逗號(hào)分隔值(Comma-Separated Values济舆,CSV,有時(shí)也稱為字符分隔值签夭,因?yàn)榉指糇址部梢圆皇嵌禾?hào))椎侠,其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本)。
- 什么是CSV文件 慎宾?
CSV文件由任意數(shù)目的記錄組成浅悉,記錄間以某種換行符分隔;每條記錄由字段組成之宿,字段間的分隔符是其它字符或字符串苛坚,最常見(jiàn)的是逗號(hào)或制表符。通常等缀,所有記錄都有完全相同的字段序列娇昙。
通常都是純文本文件txt,也可以excel表格打開(kāi)識(shí)別噪裕。
3.python中的CSV模塊
import csv
dir(csv) #查看模塊下的方法
4.csv文件的寫(xiě)入操作
import csv
#使用數(shù)字和字符串的數(shù)字都可以
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遍歷二維列表里面的每一個(gè)一維列表
wr.writerow(s) #writerow控制換行
#上面的for語(yǔ)句課直接寫(xiě)做:wr.writerows(stus)
#入創(chuàng)建CSV文件時(shí)沒(méi)有指定newline='',則每寫(xiě)入一行將有一空行被寫(xiě)入
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類,可以寫(xiě)入字典形式的數(shù)據(jù)召衔,同樣鍵也是標(biāo)頭(表格第一行)祭陷。
使用DictReader可以像操作字典那樣獲取數(shù)據(jù),把表的第一行(一般是標(biāo)頭)作為key醇蝴∠牒保可訪問(wèn)每一行中那個(gè)某個(gè)key對(duì)應(yīng)的數(shù)據(jù)。
7.用字典形式寫(xiě)csv文件和二維列表寫(xiě)一樣
import csv
#使用數(shù)字和字符串的數(shù)字都可以
headers=['姓名','年齡','性別']
stus= [
{'姓名':'張三','年齡':14,'性別':'男'},
{'姓名':'李四','年齡':23,'性別':'女'},
{'姓名':'王五','年齡':18,'性別':'女'},
{'姓名':'鄭六','年齡':20,'性別':'男'}
]
with open('stuDICT.csv','w',newline='',encoding='gbk') as f:
wr=csv.DictWriter(f,headers) #f是文件對(duì)象闸迷,header是鍵對(duì)象
wr.writeheader()#把鍵寫(xiě)進(jìn)去
wr.writerows(stus)#把字典內(nèi)容寫(xiě)進(jìn)去
8.使用reader函數(shù)俘枫,接收一個(gè)可迭代的對(duì)象(比如csv文件),能返回一個(gè)生成器今阳,就可以從其中解析出csv的內(nèi)容:比如下面的代碼可以讀取csv的全部?jī)?nèi)容茅信,以行為單位
import csv
with open('stuDICT.csv') as f:
rd=csv.reader(f)
for row in rd:
print(row)
9.使用DictReader蘸鲸,和reader函數(shù)類似,接收一個(gè)可迭代的對(duì)象酌摇,能返回一個(gè)生成器窑多,但是返回的每一個(gè)單元格都放在一個(gè)字典的值內(nèi),而這個(gè)字典的鍵則是這個(gè)單元格的標(biāo)題(即列頭)埂息。
OrderedDict:有序字典,根據(jù)放入元素的先后順序進(jìn)行字典內(nèi)容的排序
import csv
with open('stuDICT.csv') as f:
rd=csv.DictReader(f)
for row in rd:
print(row)
print('\n再次打開(kāi),只讀姓名出來(lái)')
with open('stuDICT.csv') as f:
rd=csv.DictReader(f)
names=[]
for row in rd:
names.append(row['姓名'])
print(names)
10.統(tǒng)計(jì)文件‘關(guān)于python.txt’ 中所有字符(空格铲掐、制表符和換行符不用統(tǒng)計(jì))出現(xiàn)的次數(shù)琉闪,采用“字符:次數(shù)”的方式表示,以CSV方式存儲(chǔ)在“python字符統(tǒng)計(jì).txt”文件中。
with open('關(guān)于python.txt','r',encoding='utf-8') as f:
s=f.read()#讀取的文本內(nèi)容存儲(chǔ)到變量s里面
d={}#創(chuàng)建一個(gè)空字典
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的值砂碉,如果沒(méi)有這個(gè)鍵增蹭,則返回0
del d[' ']#刪除空格
#del d['\t']#刪除制表符 可能是txt文本沒(méi)有制表符
del d['\n']#刪除換行符
mess=''
for key in d:
mess+=key+':'+str(d[key])+',' #以鍵:值的形式表現(xiàn)
mess=mess[0:len(mess)-1]
with open('python字符統(tǒng)計(jì).txt','w',encoding='utf-8') as f:
f.write(mess)
11.
'''
import csv
with open('5班學(xué)生信息.txt','r') as f:
s=f.read() #讀進(jìn)字符
print(s)
with open('5班學(xué)生信息.csv','w',encoding='gbk') as f:
w=f.write(s)
print(w)
'''
import csv
with open('5班學(xué)生信息.txt') as fr:
lines=fr.readlines() #讀進(jìn)來(lái)存儲(chǔ)成一個(gè)列表
with open('5班學(xué)生信息.csv','w',newline='') as fw:
wr=csv.writer(fw) #創(chuàng)建writer對(duì)象滋迈,使用于列表,Dictreader用于字典
header=['學(xué)號(hào)','姓名','性別','年齡','聯(lián)系方式']#寫(xiě)進(jìn)去是一個(gè)一維列表
wr.writerow(header)
for line in lines:
curr=line.strip().split(',')#對(duì)于當(dāng)前行幕侠,去掉末行的換行符再做切割碍彭,curr是一個(gè)列表
if curr:
wr.writerow(curr)
12.import csv
print('5班年齡為19歲的學(xué)生信息如下:')
print('%-6s%-6s%-6s'%('姓名','年齡','性別'))
with open('5班學(xué)生信息.csv','r') as f:
rd=csv.DictReader(f)
for row in rd:
if int(row['年齡'])==19:
print('%-6s%-8s%-6s'%(row['姓名'],row['年齡'],row['性別']))
13.小明已經(jīng)有了幾項(xiàng)熱愛(ài)的體育運(yùn)動(dòng)在sportsList中庇忌,現(xiàn)在請(qǐng)你添加上“網(wǎng)球”和“羽毛球”,去掉“冰球”
sportsList=['跑步','爬山','游泳','冰球','擊劍']
sportsList.extend(['網(wǎng)球','羽毛球'])
sportsList.remove('冰球')
print(sportsList )
13.請(qǐng)補(bǔ)充橫線處的代碼疏橄,讀入正整數(shù)n和m略就,生成m個(gè)1到1000之間的隨機(jī)整數(shù),顯示這些隨機(jī)數(shù)中能被n整除的數(shù)字
import random
n=int(input('請(qǐng)輸入除數(shù)(int): '))
m=int(input('請(qǐng)輸入隨機(jī)數(shù)的個(gè)數(shù)(int): '))
t=[] #因?yàn)橄旅媸褂昧肆斜淼腶ppend方法
for i in range(m):
t.append(random.randint(1,1000))
print('這些隨機(jī)數(shù)是',t)
ok=[]
for i in t:
if i%n==0:
ok.append(i)
if not ok:
print('沒(méi)找到合適的隨機(jī)數(shù)')
else:
print('能整除的數(shù)有',ok)
15.'''
已知“汽車(chē)報(bào)價(jià)信息.csv”中存放有汽車(chē)產(chǎn)品型號(hào)及其報(bào)價(jià)范圍立砸,
從文件中讀取出來(lái)初茶,并根據(jù)用戶要選擇的型號(hào)或者價(jià)格范圍打印出相關(guān)信息浊闪。
'''
import csv
type=input('你想要查找的型號(hào)是螺戳,如果無(wú)要求則直接回車(chē): ')
s=input('你的接受價(jià)格(單位:萬(wàn))是 ,如果無(wú)要求則直接回車(chē): ')
if s:
price=int(s)
else:
price=0
with open('汽車(chē)報(bào)價(jià)信息.csv') as f:
rd=csv.DictReader(f)
for row in rd:
xinghao=row['型號(hào)'] #獲取汽車(chē)型號(hào)
minPrice=int(row['最低報(bào)價(jià)']) #獲取最低報(bào)價(jià)
maxPrice=int(row['最高報(bào)價(jià)']) #獲取最高報(bào)價(jià)
if (type=='無(wú)' or type in xinghao) and \
(price==0 or minPrice<=price<=maxPrice):
print(xinghao,minPrice,maxPrice)
print('查找結(jié)束!')
jieba模塊
什么是jieba(二級(jí)考證必選庫(kù)): Python中的第三方中文分詞擴(kuò)展庫(kù)倔幼,支持三種分詞模式:
1)精確模式:適合文本分析
2)全模式:速度快,但不能解決歧義
3)搜索引擎模式翩腐,適用于搜索引擎分詞
Jieba中的主要函數(shù):
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('中國(guó)人民終于站起來(lái)了,反抗帝國(guó)主義的入侵')
print(s)
jieba.add_word('站起來(lái)') #精準(zhǔn)切法
s=jieba.lcut('中國(guó)人民終于站起來(lái)了泥畅,反抗帝國(guó)主義的入侵')
print(s)
1.統(tǒng)計(jì)文件‘關(guān)于python.txt’ 中所有詞語(yǔ)出現(xiàn)的次數(shù)们豌,采用“詞語(yǔ):次數(shù)”的方式表示,以CSV方式存儲(chǔ)在“python詞語(yǔ)統(tǒng)計(jì).txt”文件中障癌。
'''
統(tǒng)計(jì)文件‘關(guān)于python.txt’ 中所有詞語(yǔ)出現(xiàn)的次數(shù)辩尊,采用“詞語(yǔ):次數(shù)”的方式表示,
以CSV方式存儲(chǔ)在“python詞語(yǔ)統(tǒng)計(jì).txt”文件中轿亮。
import jieba
with open('關(guān)于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的值胸墙,如果沒(méi)有這個(gè)鍵,則返回0
mess=[]
for key in d:
mess.append("{}:{}".format(key,d[key]))
with open('python詞語(yǔ)統(tǒng)計(jì)1.txt','w',encoding='utf-8') as f:
f.write(','.join(mess))
二進(jìn)制文件的讀寫(xiě)流程
1)使用open()以某個(gè)指定的模式加’b’打開(kāi)文件
2)以該模式操作文件存取的都是字節(jié)但骨,也就是bytes或者bitearray,而不是字符
例如:
f.write(b’hello’):將字符串“hello”轉(zhuǎn)換成字節(jié)數(shù)據(jù)再寫(xiě)入文件中
f.read(n):從文件中讀入至多n個(gè)字節(jié)掠抬,返回一個(gè)bytes對(duì)象
3)關(guān)閉文件f.close(),在沒(méi)有使用with語(yǔ)句下
1.查看字節(jié)碼校哎。
#123.txt
hi, sun
中午好
hi, stars
filename=input('請(qǐng)輸入二進(jìn)制文件的名稱: ')
with open(filename,'rb') as f:
index=0 #用來(lái)下面統(tǒng)計(jì)換行
while True:
temp = f.read(1)#每次讀一個(gè)字節(jié)進(jìn)來(lái)
if len(temp) ==0:#如果讀到的字節(jié)為0,說(shuō)明文件到達(dá)尾部
break #出去
else:
print('%3s' % temp,end='')#顯示當(dāng)前字節(jié)腰奋,顯示內(nèi)容
index=index+1#行內(nèi)字?jǐn)?shù)+1
if index ==10:#這里換行抱怔,每行打印10個(gè)字節(jié)就換行
index=0#重置
print()
輸入的二進(jìn)制文件也可以是圖片.png形式
2.二進(jìn)制文件的隨機(jī)訪問(wèn) 文件的讀取和寫(xiě)入一般是從當(dāng)前位置(打開(kāi)文件時(shí)位置是0)操作到文件的結(jié)尾(EOF),即按順序進(jìn)行訪問(wèn)。
文件對(duì)象也支持seek()方法绕沈,它通過(guò)字節(jié)偏移量將讀取/寫(xiě)入位置移動(dòng)到文件中的任意位置帮寻,從而實(shí)現(xiàn)文件的隨機(jī)訪問(wèn)。
具體語(yǔ)法如下: f.seek(offset[, whence])
說(shuō)明:offset -- 開(kāi)始的偏移量固逗,也就是代表需要移動(dòng)偏移的字節(jié)數(shù)烫罩;
whence:可選,默認(rèn)值為 0贝攒,表示要從哪個(gè)位置開(kāi)始偏移;其值可以是os.SEEK_SET哈踱、os.SEEK_CUR梨熙、os.SEEK_END,也可以用0邪财、1、2表示卧蜓,其意義分別是:0代表從文件開(kāi)頭開(kāi)始算起,1代表從當(dāng)前位置開(kāi)始算起榨惠,2代表從文件末尾算起盛霎。
3.二進(jìn)制文件的隨機(jī)定位
from os import SEEK_END #定向?qū)肽K成員的方法,可以減輕代碼負(fù)重
with open('ran.txt','w+b') as f: #w+模式的運(yùn)作
#寫(xiě)入文件
f.write(b'hi,Sum\n')
f.write(b'hi,python\n')
f.write(b'hi,morning\n')
#隨機(jī)讀取文件的指定位置信息
print('\n當(dāng)前文件內(nèi)容是: ')
f.seek(0)#文件的索引從零開(kāi)始
content=f.read()
print(content) #用content變量接受
print('文件長(zhǎng)度是',len(content))
print()
f.seek(3)#去到3號(hào)位
print('當(dāng)前位置是',f.tell())#顯示當(dāng)前存取的位置
print('讀3個(gè)字節(jié):',f.read(3))
print('當(dāng)前位置是', f.tell()) # 顯示當(dāng)前存取的位置
print('讀4個(gè)字節(jié):', f.read(4))
f.seek(-8,SEEK_END)#os.SEEK_END表示結(jié)尾期揪,也可以寫(xiě)成2
print('當(dāng)前位置是', f.tell()) # 顯示當(dāng)前存取的位置
print('讀8個(gè)字節(jié):', f.read(8))
#下面是修改文件
f.seek(0)#回到零號(hào)位
f.write(b'afternoon')
print('\n修改后的內(nèi)容是\n')
f.seek(0)#定位到文件開(kāi)始
content=f.read()
print(content)
print('文件的長(zhǎng)度是',len(content))