Python 深入淺出 - IO 編程

標準輸入 - 鍵盤

默認的標準輸入是鍵盤,Python 內置函數 input() 函數可以從標準輸入讀入一行文本。

str = input("請輸入你的名字:")
print("你的名字:" ,str)

輸出結果:

請輸入你的名字:star

你的名字: star

文件操作

open() 函數

語法: File object = open(file_name [,access_mode] [,buffering])

參數說明:

  • file_name: 是一個包含要訪問的文件名稱的字符串值。
  • access_mode : 決定了打開文件的模式。
  • buffering :如果buffering的值被設爲0,就不會有寄存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設爲大於1的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則爲系統默認。

File 對象

一個文件被打開後,得到一個 File 對象。可以獲取該文件的各種信息。

file 屬性

  • file.closed: 文件已被關閉,返回 true
  • file.mode : 返回被打開文件訪問模式
  • file.name : 返回文件的名稱
  • file.softspace: 如果用 print() 輸出後,必須跟一個空格符,則放回 false,否則返回 true


file = open("d:\\a.jpg","wb")
print("file.name = ",file.name)
print("file.closed = ", file.closed)
print("file.mode = ",file.mode)

輸出結果:

file.name = d:\a.jpg

file.closed = False

file.mode = wb

file 函數

  • file.close():關閉文件,釋放資源,關閉文件不能再進行讀寫操作。
  • file.flush():刷新文件內部緩衝,直接把內部緩衝區數據立即寫入到文件。
  • file.filenno():返回一個整型文件描述符。
  • file.isatty():如果文件連接到一個終端設備就返回 True,否則返回 False。
  • file.next():返回文件下一行。
  • file.read([size]):從文件讀取指定字節數,如果未給定或爲負數,則讀取所有。
  • file.readline([size]):讀取正整行,包括 “\n” 字符。
  • file.readlines([sizeint]):讀取所有行並返回列表,若給定 sizeint>0 ,則是設置一次讀取多少字節,這是爲了減輕讀取壓力。
  • file.seek(offset[,whence]): 設置文件當前位置。
  • file.tell():返回文件當前位置。
  • file.truncate([size]):截取文件,截取的字節通過 size 指定,默認爲當前文件位置。
  • file.write(str):將字符串寫入文件,沒有返回值。
  • file.writelines(sequence):向文件寫入一個序列字符串列表,如果需要換行則要自己假如每行的換行符。


file_obj = open('D:/read.txt','r+')
try:
    all_content = file_obj.read()
    print("file open success")
    print("all_content = ", all_content)
    print("")
except:
    print("file open failed")
finally:
    file_obj.close()

輸出結果:

file open success

all_content = Python 深入淺出

1.HelloWorld

2.函數

3.高階函數

4.面向對象

file_write = open("D:/write.txt","w")
file_write.write("www.baidu.com")
file_write.close()

輸出結果:

OS 文件/目錄方法

  • os.access(path,mode):檢驗權限模式。
  • os.chdir(path):改變當工作目錄。
  • os.chflags(path,flags):設置路徑的標記爲數字標記。
  • os.chmod(path,mode):更改權限。
  • os.chown(path,uid,gid):更改文件所有者。
  • os.chroot(path):改變當前進程的跟目錄。
  • os.close(fd):關閉文件描述符 fd。
  • os.closerange(fd_low,fd_high) 關閉所有文件描述符
  • os.dup(fd) 複製文件描述符 fd


import os
print("os.name = ",os.name)
print("os.environ = ",os.environ) #環境變量

輸出結果:
os.name = nt

os.environ = environ({‘ALLUSERSPROFILE’: ‘C:\ProgramData’, ‘APPDATA’: ‘C:\Users\Administrator\AppData\Roaming’, ‘COMMONPROGRAMFILES’: ‘C:\Program Files\Common Files’, ‘COMPUTERNAME’: ‘hy-201710072001’, ‘COMSPEC’: ‘C:\Windows\system32\cmd.exe’, ‘DEVMGR_SHOW_DETAILS’: ‘1’, ‘FP_NO_HOST_CHECK’: ‘NO’, ‘HOMEDRIVE’: ‘C:’, ‘HOMEPATH’: ‘\Users\Administrator’, ‘JAVA_HOME’: ‘C:\Program Files\Java\jdk1.8.0_144’, ‘LOCALAPPDATA’: ‘C:\Users\Administrator\AppData\Local’, ‘LOGONSERVER’: ‘\\hy-201710072001’, ‘NUMBER_OF_PROCESSORS’: ‘4’, ‘OS’: ‘Windows_NT’, ‘PATH’: ‘C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.8.0_144\bin;C:\Program Files\Git\cmd;C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools;C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\;C:\Users\Administrator\AppData\Local\Programs\Fiddler;E:\Python\venv\Scripts’, ‘PATHEXT’: ‘.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC’, ‘PROCESSOR_ARCHITECTURE’: ‘x86’, ‘PROCESSOR_IDENTIFIER’: ‘x86 Family 6 Model 37 Stepping 2, GenuineIntel’, ‘PROCESSOR_LEVEL’: ‘6’, ‘PROCESSOR_REVISION’: ‘2502’, ‘PROGRAMDATA’: ‘C:\ProgramData’, ‘PROGRAMFILES’: ‘C:\Program Files’, ‘PROMPT’: ‘(venv) P G’, ‘PSMODULEPATH’: ‘C:\Windows\system32\WindowsPowerShell\v1.0\Modules\’, ‘PUBLIC’: ‘C:\Users\Public’, ‘PYCHARM_HOSTED’: ‘1’, ‘PYCHARM_MATPLOTLIB_PORT’: ‘49911’, ‘PYTHONIOENCODING’: ‘UTF-8’, ‘PYTHONPATH’: ‘C:\Program Files\JetBrains\PyCharm 2017.3\helpers\pycharm_matplotlib_backend;E:\Python’, ‘PYTHONUNBUFFERED’: ‘1’, ‘SESSIONNAME’: ‘Console’, ‘SYSTEMDRIVE’: ‘C:’, ‘SYSTEMROOT’: ‘C:\Windows’, ‘TEMP’: ‘C:\Users\ADMINI~1\AppData\Local\Temp’, ‘TMP’: ‘C:\Users\ADMINI~1\AppData\Local\Temp’, ‘USERDOMAIN’: ‘hy-201710072001’, ‘USERNAME’: ‘Administrator’, ‘USERPROFILE’: ‘C:\Users\Administrator’, ‘VIRTUAL_ENV’: ‘E:\Python\venv’, ‘WINDIR’: ‘C:\Windows’, ‘WINDOWS_TRACING_FLAGS’: ‘3’, ‘_OLD_VIRTUAL_PATH’: ‘C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.8.0_144\bin;C:\Program Files\Git\cmd;C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools;C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\;C:\Users\Administrator\AppData\Local\Programs\Fiddler’, ‘_OLD_VIRTUAL_PROMPT’: ‘P G’})

StringIO

StringIO 在內存中 讀寫 str. getvalue() 方法用於獲得寫入後的str.

from io import StringIO
f = StringIO()
f.write("Hello,Python")
print(f.getvalue())

StringIO 想內存中寫入字符串,再通過 getvalue() 獲取。

輸出結果:

Hello,Python

序列化

序列化:把變量從內存中變成可以存儲或傳輸的過程。在其他語言中稱之爲 serialization,marshalling,在 Python 中稱之爲 pickling。

反序列化:把變量內容從序列化的對象重新讀到內存裏,稱 unpickling。

import pickle
file_tom = open("D:/tom.txt","wb")
d = dict(name="tom",age=20,score=90)
byte_buffer = pickle.dump(d,file_tom)

pickle.dump 將 dict 對象序列化爲 bytes,然後寫入到文件中。

JSON

JSON 函數

使用 JSON 函數需要導入 JSON 庫:import json

函數 描述
json.dumps() 將 Python 對象轉換成 JSON 字符串
json.loads() 將 JSON 字符串轉換成 Python 對象

內置對象與 JSON 轉換

import json
tomcat = dict(name='tomcat',age= 22,score =90)
json_str = json.dumps(tomcat)   # 對象轉換成 json 字符串
print(json_str)

tomcat_obj = json.loads(json_str)  # json 字符串轉換成對象
print("tomcat_obj type = ",type(tomcat_obj))
print("tomcat_obj = ",tomcat_obj)

輸出結果:

{“name”: “tomcat”, “age”: 22, “score”: 90}

tomcat_obj type = <class ‘dict’>

tomcat_obj = {‘name’: ‘tomcat’, ‘age’: 22, ‘score’: 90}

普通 class 對象轉換成 JSON

普通 class 對象如果沒有做處理,將會轉換失敗。

TypeError: Object of type ‘Student’ is not JSON serializable

解決辦法: dumps(obj,default) 可選參數 default 就是把任意一個對象轉換成一個可序列爲 JSON 的對象。

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


def stu2dict(stu):
    return {
        'name':stu.name,
        'age':stu.age
    }


stu  = Student("mike",22)
print(json.dumps(stu,default=stu2dict))

輸出結果:

{“name”: “mike”, “age”: 22}

JSON 轉換成對象

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

    def __str__(self):
        return "name = %s, age = %d" % (self.name,self.age)


def dict2stu(d):
    return Student(d['name'],d['age'])

json_stu = '{"name":"luse","age":15}'
s_obj = json.loads(json_stu,object_hook=dict2stu)  # JSON 轉換成對象
print(type(s_obj))
print(s_obj)

輸出結果:

<class ‘main.Student’>

name = luse, age = 15

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