中介者模式(調停,學習筆記18)
阿新 • • 發佈:2021-11-19
檔案操作
操作CSV檔案:
檔案儲存:
有時候我們有了一個數組,需要儲存到檔案中,那麼可以使用np.savetxt
來實現。相關的函式描述如下:
np.savetxt(frame, array, fmt='%.18e', delimiter=None)
* frame : 檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案
* array : 存入檔案的陣列
* fmt : 寫入檔案的格式,例如:%d %.2f %.18e
* delimiter : 分割字串,預設是任何空格
以下是使用的例子:
a = np.arange(100).reshape(5,20) np.savetxt("a.csv",a,fmt="%d",delimiter=",")
讀取檔案:
有時候我們的資料是需要從檔案中讀取出來的,那麼可以使用np.loadtxt
來實現。相關的函式描述如下:
np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
* frame:檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案。
* dtype:資料型別,可選。
* delimiter:分割字串,預設是任何空格。
* skiprows:跳過前面x行。
* usecols:讀取指定的列,用元組組合。
* unpack:如果True,讀取出來的陣列是轉置後的。
np獨有的儲存解決方案:
numpy
中還有一種獨有的儲存解決方案。檔名是以.npy
npz
結尾的。以下是儲存和載入的函式。
- 儲存:
np.save(fname,array)
或np.savez(fname,array)
。其中,前者函式的副檔名是.npy
,後者的副檔名是.npz
,後者是經過壓縮的。 - 載入:
np.load(fname)
。
總結:
1、np.savetxt和np.loadtxt一般用來操作csv檔案,他可以設定header,但是不能儲存3維以上的陣列。
2、 np.save和np.load一般用來儲存非文字型別的檔案,他不可以設定header,但是可以儲存3維以上的陣列。
3、如果想專門的操作CSV檔案,其實還有另外一個模組叫做csv,這個模組是python內建的,不需要安裝。
CSV檔案操作:
讀取csv檔案:
import csv # 讀取csv檔案,就需要匯入python內建的這個csv模組
with open('stock.csv','r') as fp: # 首先開啟檔案,然後將指標傳給reader這個物件
reader = csv.reader(fp)
titles = next(reader) # next會將這個迭代器往下挪一位,不帶標題,這個時候再去遍歷reader時,從第一行開始。
for x in reader:
print(x)
這樣操作,以後獲取資料的時候,就要通過下表來獲取資料。如果想要在獲取資料的時候通過標題來獲取。那麼可以使用DictReader
。示例程式碼如下:
import csv
with open('stock.csv','r') as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x['turnoverVol'])
import csv
def read_csv_demo1():
with open('stock.csv', 'r') as fp:
# reader是一個迭代器
reader = csv.reader(fp)
# next(reader)
for x in reader:
name = x[3]
volumn = x[-1]
print({'name': name, 'volumn': volumn})
def read_csv_demo2():
with open('stock.csv','r') as fp:
# 使用DictReader建立的reader物件
# 不會包含標題那行的資料
# reader是一個迭代器,遍歷這個迭代器,返回來的是一個字典。
reader = csv.DictReader(fp)
for x in reader:
value = {"name":x['secShortName'],'volumn':x['turnoverVol']}
print(value)
# read_csv_demo1()
read_csv_demo2()
# 輸出:
{'name': '平安銀行', 'volumn': '178493315'}
{'name': '萬科A', 'volumn': '55743855'}
{'name': '國農科技', 'volumn': '2211059'}
{'name': '世紀星源', 'volumn': '2365348'}
{'name': '深振業A', 'volumn': '0'}
{'name': '全新好', 'volumn': '0'}
{'name': '神州高鐵', 'volumn': '5689054'}
寫入資料到csv檔案:
寫入資料到csv檔案,需要建立一個writer
物件,主要用到兩個方法。一個是writerow
,這個是寫入一行。一個是writerows
,這個是寫入多行。示例程式碼如下:
import csv
headers = ['name','age','classroom']
values = [
('zhiliao',18,'111'),
('wena',20,'222'),
('bbc',21,'111')
]
with open('test.csv','w',newline='') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
也可以使用字典的方式把資料寫入進去。這時候就需要使用DictWriter
了。示例程式碼如下:
import csv
headers = ['name','age','classroom']
values = [
{"name":'wenn',"age":20,"classroom":'222'},
{"name":'abc',"age":30,"classroom":'333'}
]
with open('test.csv','w',newline='') as fp:
writer = csv.DictWriter(fp,headers)
writer.writerow({'name':'zhiliao',"age":18,"classroom":'111'})
writer.writerows(values)
def write_csv_demo1():
headers = ['username', 'age', 'height']
values = [
('張三', 18, 180),
('李四', 19, 190),
('王五', 20, 160)
]
with open('classroom.csv', 'w', encoding='utf-8', newline='') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
def write_csv_demo2():
headers = ['username', 'age', 'height']
values = [
{'username':'張三','age':18,'height':180},
{'username':'李四','age':19,'height':190},
{'username':'王五','age':20,'height':160}
]
with open('classroo1.csv','w',encoding='utf-8',newline='') as fp:
writer = csv.DictWriter(fp,headers)
# 寫入表頭資料的時候,需要呼叫writeheader方法
writer.writeheader()
writer.writerows(values)
# write_csv_demo1()
write_csv_demo2()