#!/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