IO/序列化/JSON

一.讀寫文件

1.open:打開文件

open(path, mode, encoding='xxx', errors='ignore')json


mode取值:
rU 或 Ua 以讀方式打開, 同時提供通用換行符支持 (PEP 278)
w 以寫方式打開,
a 以追加模式打開 (從 EOF 開始, 必要時建立新文件)
r+ 以讀寫模式打開,先讀後寫(注意須要將文件指針重置爲0,f.seek(0), 不然將變成追加內容)
w+ 以讀寫模式打開 (參見 w ), 先寫後讀
a+ 以讀寫模式打開 (參見 a )
rb 以二進制讀模式打開
wb 以二進制寫模式打開 (參見 w )
ab 以二進制追加模式打開 (參見 a )
rb+ 以二進制讀寫模式打開 (參見 r+ )
wb+ 以二進制讀寫模式打開 (參見 w+ )
ab+ 以二進制讀寫模式打開 (參見 a+ )編碼

 

2.read:讀取所有內容

3.readline:讀取一行內容:

4.readlines:讀取全部行,做爲列表返回

5.write:寫入內容

6.writelines:寫入序列字符串

7.close:關閉打開的文件,打開的文件必須及時關閉

 

示例代碼:spa

f = open('a.txt', 'r')
content = f.read()
f.close()

print(content)

  

示例代碼2:指針

f = open('a.txt', 'r')
content = ''
for line in f.readlines():
    content += line.strip() #過濾尾部換行符
f.close()

print(content)

  

示例代碼3:code

f = open('a.txt', 'r')
content = ''
for line in f.readlines():
    content += line.strip() #過濾尾部換行符
f.close()

print(content)

  

二.更加簡便的方法with

1.由於讀取文件後要關閉,因此通常代碼會以下所示:

content = ''
try:
    f = open('a.txt', 'r')
    for line in f.readlines():
        content += line.strip() #過濾尾部換行符
except BaseException:
    pass
finally:
    f.close()

print(content)

  

2.使用with

示例代碼對象

content = ''
with open('a.txt', 'r') as f:
    for line in f.readlines():
        content += line.strip() #過濾尾部換行符
print(content)

  

示例代碼:blog

with open('a.txt', 'a') as f:
    f.writelines(['Hello, world!\n','Hello, world!\n'])

  

二.內存讀寫

1.字符串讀寫

藉助StrongIO和文件讀寫大體相同,調用close時,內存釋放ip

示例:內存

from io import StringIO

f = StringIO()
f.write('hello')
f.write('word')
print(f.getvalue())
f.close()

  

2.字節讀寫

藉助BytesIO和文件讀寫大體相同,調用close時,內存釋放utf-8

from io import BytesIO

f = BytesIO()
f.write('你'.encode('utf-8')) #寫入通過UTF-8編碼的bytes
f.write('好'.encode('utf-8')) #寫入通過UTF-8編碼的bytes
print(f.getvalue())
f.close()

  

三.操做文件和目錄

1.系統類型:

>>> import os
>>> os.name
'nt'

  

posix,說明系統是Linux、Unix或Mac OS X,若是是nt,就是Windows系統。

2.環境變量:

>>> os.environ
>>> os.environ.get('PATH') #獲取其中一項

  

3.目錄/路徑

os.path模塊中的方法

>>> os.path.abspath('.') #當前目錄絕對路徑
>>> os.path.join(os.path.abspath('.'), 'test') #合併路徑
>>> os.mkdir('ror') #建立目錄
>>> os.rmdir('ror') #刪除目錄
>>> os.rename('test.txt', 'test.py') #文件重命名
>>> os.remove('test.py') #刪除文件

  

#拆分路徑
>>> os.path.split('/usr/ror/a.txt')
('/usr/ror', 'a.txt')

#拆分擴展名
>>> os.path.splitext('/usr/ror/a.txt')
('/usr/ror/a', '.txt')

  

#列出當前目錄下全部的txt文件
>>> [file for file in os.listdir('.') if os.path.isfile(file) and os.path.splitext(file)[1] == '.txt']

#拷貝文件(拷貝當前目錄下a.txt到b.txt)
>>> import shutil
>>> shutil.copyfile('a.txt', 'b.txt')

  

四.序列化/反序列化

1.序列化

示例代碼:

>>> import pickle
>>> d=dict(age=10,name='g')
>>> pickle.dumps(d) #dumps 方法把任意對象序列化成一個bytes
>>> f=open('a.txt', 'wb')
>>> pickle.dump(d, f)  #dump()直接把對象序列化後寫入一個文件對象
>>> f.close()

  

2.反序列化

能夠先把內容讀到一個bytes,而後用pickle.loads()方法反序列化出對象,也能夠直接用pickle.load()方法從一個文件對象中直接反序列化出對象

>>> f=open('a.txt', 'rb')
>>> d=pickle.load(f)
>>> f.close()
>>> d
{'age': 10, 'name': 'g'}

  

五.JSON

1.dict

>>> import json
>>> d=dict(age=10,name='g')
>>> json_str = json.dumps(d) #從字典/對象序列化
>>> json_str
'{"age": 10, "name": "guobin"}'
>>> json.loads(json_str) #從字符串反序列化
{u'age': 10, u'name': u'guobin'}

  

2.class

示例代碼

import json

class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# json encode obj
f = Foo('g', 15)
print(json.dumps(f.__dict__))

#json decode obj
def hook(d):
    return Foo(d['name'], d['age'])
f2 = json.loads('{"name": "g", "age": 15}', object_hook= hook)
print(f2)

  

輸出:{"name": "g", "age": 15}<__main__.Foo object at 0x00000213E383A940>

相關文章
相關標籤/搜索