python學習筆記(五)---基礎IO操作

依據廖雪峯官方網站的python教程整理

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


__author__ = "KingRumn"

'''
    基礎IO操作
    文件讀寫、StringIO、BytesIO、文件和目錄操作、序列化
'''

from io import StringIO
from io import BytesIO
import os
import pickle

# 文件IO
# 讀文件
# 第一步: 打開文件
'''
    open(name[, mode[, buffering]])
    name : 一個包含了你要訪問的文件名稱的字符串值,接受絕對路徑和相對路徑;
    mode : mode 決定了打開文件的模式:只讀,寫入,追加等,默認爲只讀(r);
    buffering : 如果 buffering 的值被設爲 0,就不會有寄存。如果 buffering 的值取 1,訪問文件時會寄存行。
                如果將 buffering 的值設爲大於 1 的整數,表明了這就是的寄存區的緩衝大小。
                如果取負值,寄存區的緩衝大小則爲系統默認
    r:只讀,指針位於開頭,不存在則報錯;rb:二進制只讀;r+:可讀可寫,打開文件,指針位於文件頭;rb+:二進制可讀寫;
    w:寫入,如有文件,刪除內容,否則創建文件;wb:二進制可寫;w+:讀寫;wb+:二進制讀寫;
    a:追加,指針位於文件末尾,文件不存在,創建文件;ab:二進制追加;a+:追加讀寫;ab+:二進制追加讀寫;

'''

# f=open('notfound.txt', 'r')  # FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
f = open('test.txt', 'r')

# 第二步:讀取文件
# read()方法可以一次讀取文件的全部內容,用一個str表示
print(f.read())     # 'test line 1\ntest line 2'

# 第三步:關閉文件
f.close()

# 利用try...finally保證close的正確調用
try:
    f = open('test.txt', 'r')
    print(f.read())
finally:
    if f:
        f.close()

# 利用with簡化close調用
with open('test.txt', 'r') as f:
    print(f.read())

# 調用readline()可以每次讀取一行內容
with open('test.txt', 'r') as f:
    print(f.readline())        # test line 1

# 調用readlines()一次讀取所有內容並按行返回list
with open('test.txt', 'r') as f:
    for line in f.readlines():
        # 把末尾的'\n'刪掉
        print(line.strip())  # test line 1

# file-like object
# 不要求從特定類繼承,只要寫個read()方法就行

# 利用encoding函數指定編碼格式
# errors='ignore' 可以避免一些不規範的編碼字符拋出異常
with open('test.txt', 'r', encoding='utf-8', errors='ignore') as f:
    print(f.readline())

# 寫文件
with open('test.txt', 'w') as f:
    f.write('Hello, world!')

# StringIO:內存中讀寫str
# from io import StringIO
# 創建IO
f = StringIO()

# 寫入內容
f.write('hello\nTom\ncatch out')

# 讀取內容
print(f.readline())
print(f.getvalue())

# 利用str直接初始化StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
print(f.getvalue())

# BytesIO: 在內存中讀寫bytes
# from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

# 用二進制數據直接初始化BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(f.getvalue())

# 操作文件和目錄
# import os

# 獲取操作系統名稱
# 如果是posix,說明系統是Linux、Unix或Mac OS X,如果是nt,就是Windows系統
print(os.name)

# 獲取環境變量
print(os.environ)       # 'C:\\Windows\\system32;...'
# 獲取某個環境變量
print(os.environ.get('path'))   # 'C:\\Users\\xxx\\AppData\\Roaming'

# 獲取當前絕對路徑
print(os.path.abspath('.'))
# 連接路徑: os.path.join()函數,這樣可以正確處理不同操作系統的路徑分隔符
print(os.path.join('/Users/michael', 'testdir'))
# 拆分路徑
print(os.path.split('/Users/michael/testdir/file.txt'))
# 創建目錄
os.mkdir('testdir')
# 刪除目錄
os.rmdir('testdir')
# os.path.splitext()可以直接讓你得到文件擴展名
os.path.splitext('/path/to/file.txt')   # ('/path/to/file', '.txt')
# 重命名
os.rename('test.txt', 'test.py')
os.rename('test.py', 'test.txt')
# 列出當前路徑下的所有目錄
print(list([x for x in os.listdir('.') if os.path.isdir(x)]))
# 列出當前路徑下的py文件
print(list([x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']))

# 序列化
# 把變量從內存中變成可存儲或傳輸的過程稱之爲序列化
# 序列化之後,就可以把序列化後的內容寫入磁盤,或者通過網絡傳輸到別的機器上
# 反過來,把變量內容從序列化的對象重新讀到內存裏稱之爲反序列化,即unpickling
# pickle模塊實現序列化
# import pickle
d = dict(name='Bob', age=20, score=88)

# 序列化
with open('dump.txt', 'wb') as f:
    pickle.dump(d, f)

# 加載
with open('dump.txt', 'rb') as f:
    dl = pickle.load(f)
    print(dl)
    print(d)

更多更及時的博客更新請戳—> KingRumn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章