1. 程式人生 > 其它 >中介者模式(調停,學習筆記18)

中介者模式(調停,學習筆記18)

檔案操作

操作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結尾的。以下是儲存和載入的函式。

  1. 儲存:np.save(fname,array)np.savez(fname,array)。其中,前者函式的副檔名是.npy,後者的副檔名是.npz,後者是經過壓縮的。
  2. 載入: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()