1. 程式人生 > >【python3的學習之路十四】IO編程

【python3的學習之路十四】IO編程

函數 詳細 遇到 作文件 否則 truncate inux load remove

技術分享圖片

File(文件) 方法

file 對象使用 open 函數來創建

file.close()                關閉文件。關閉後文件不能再進行讀寫操作。
file.flush()                刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。
file.fileno()               返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。
file.isatty()                如果文件連接到一個終端設備返回 True,否則返回 False。
file.next()                  返回文件下一行。
file.read([size])            從文件讀取指定的字節數,如果未給定或為負則讀取所有。
file.readline([size])        讀取整行,包括 
"\n" 字符。 file.readlines([sizeint]) 讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint字節的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩沖區。 file.seek(offset[, whence]) 設置文件當前位置 file.tell() 返回文件當前位置。 file.truncate([size]) 從文件的首行首字符開始截斷,截斷文件為 size 個字符,無 size 表示從當前位置截斷;截斷之後後面的所有字符被刪除,其中 Widnows 系統下的換行代表2個字符大小。 file.write(str) 將字符串寫入文件,返回的是寫入的字符長度。 file.writelines(sequence) 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。

讀文件

要以讀文件的模式打開一個文件對象,需要使用python內置的open()函數。

f = open(xxx/test.txt, r)
# 標識符‘r‘表示讀
f.read()
# 文件打開成功,調用read()方法可以一次讀取文件的全部內容,Python把內容讀到內存,用一個str對象表示
f.close()
# 調用close()方法關閉文件

由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用

with open(xxx/test.txt, r) as f:
     print(f.read())

用readline()可以每次讀取一行內容,調用readline()一次讀取所有內容並按行返回list

for line in f.readlines():
    print(line.strip())  # 把末尾的‘\n‘刪掉

字符編碼

要讀取非UTF-8編碼的文本文件,需要給open()函數傳入encoding參數

f.open(xxx/test.txt, r, encoding = GBK errors = ignore)
f.read()
# 遇到有些編碼不規範的文件,可能會遇到UnicodeDecodeError,遇到這種情況,open()函數還接收一個errors參數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略

寫文件

調用open()函數時,傳入標識符’w’或者’wb’表示寫文本文件或者二進制文件

f = open(xxx/test.txt, w)
f.write(Hello, world!)
f.close()

當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而實放入內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤,忘記調用close()的後果時數據可能只寫了一部分到磁盤,剩下的丟失。

with open(xxx/test.txt, w) as f:
     f.write(Hello, world!)

以’w’模式寫入文件時,如果文件已存在,會直接覆蓋(相當於刪掉後新寫入一個文件)。如果我們希望追加到文件末尾怎麽辦?可以傳入’a’以追加(append)模式寫入。

StringIO

很多時候,數據讀寫不一定時文件,也可以在內存中讀寫。StringIO就是在內存中讀寫str。getvalue()方法用於獲得寫入後的str。

from io import StringIO

f = StringIO()
f.write(hello)
f.wirte( )
f.write(world!)
print(f.getvalue())
# hello world!

要讀取StringIO,可以用一個str初始化StringIO,然後像文件一樣讀取

from io import StringIO

f = StringIO(Hello!\nHi!\nGoodbye!)
while True:
     s = f.readline()
     if s == ‘‘:
        break
     print(s.strip())
# Hello!
# Hi!
# Goodbye!

bytesIO

StringIO操作的只能是str,如果要操作二進制數據,就需要使用bytesIO。
BytesIO實現了在內存中讀寫bytes,我們創建一個BytesIO,然後寫入一些bytes。

from io import BytesIO

f = BytesIO()
f.write(中文, encode(UTF-8))
print(f.getvalue()) # b‘\xe4\xb8\xad\xe6\x96\x87‘

此時寫入的不是str,而是經過UTF-8編碼的bytes。
和StringIO類似,可以用一個bytes初始化BytesIO,然後像文件一樣讀取

from io import BytesIO

f = BytesIO(b\xe4\xb8\xad\xe6\x96\x87)
print(f.read())
b\xe4\xb8\xad\xe6\x96\x87

OS文件/目錄方法

環境變量

在操作系統中定義的環境變量,全部保存在os.environ這個變量中,可以直接查看

import os

os.name # 操作系統類型如果是posix,說明系統是Linux、Unix或Mac OS X,如果是nt,就是Windows系統
os.uname()  # 獲取詳細的系統信息,uname()函數在windows上不提供
os.environ  # 獲取操作系統中定義的環境變量
os.environ.get(PATH) # 獲取某個環境變量的值

操作文件和目錄

操作文件和目錄的函數一部分放在os模塊中,一部分放在os.path模塊中。

# 查看當前目錄的絕對路徑:
>>> os.path.abspath(.)
/Users/michael
# 在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來:
>>> os.path.join(/Users/michael, testdir)
/Users/michael/testdir
# 拆分文件路徑
>>> os.path.split(/Users/michael/testdir/file.txt)
(/Users/michael/testdir, file.txt)
# 獲取文件擴展名
>>> os.path.splitext(/Users/michael/testdir/file.txt)
(/Users/michael/testdir/file.txt, txt)
# 然後創建一個目錄:
>>> os.mkdir(/Users/michael/testdir)
# 刪掉一個目錄:
>>> os.rmdir(/Users/michael/testdir)
# 對文件重命名:
>>> os.rename(test.txt, test.py)
# 刪掉文件:
>>> os.remove(test.py)

【python3的學習之路十四】IO編程