筆記3

文件讀寫

Python內置了讀寫文件的函數,用法和C是兼容的。
在磁盤上讀寫文件的功能都是由操做系統提供的,現代操做系統不容許普通的程序直接操做磁盤,因此,讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 打開文件,r表示read,w爲write,a爲append,b爲binary
# 文件不存在則拋出IOError
f = open('E:\Python\myapp.log', 'r')
f = open('E:\Python\myapp.log', 'rb')
f = open('E:\Python\myapp.log', 'r', encoding='gbk')
f = open('E:\Python\myapp.log', 'r', encoding='gbk', errors='ignore')

# 讀文件
f.read() # 一次性讀取文件的所有內容到內存
f.readline() # 一次讀取一行
f.read(size) # 每次最多讀取size個字節
f.readlines() # 一次讀取全部內容並按行返回list

# 寫文件
f.write('Hello, world!')

# 寫入數據,清空緩衝區
f.flush()

# 把文件指針歸零
f.seek(0)

# 關閉文件
f.close() # 調用此方法,系統才保證把數據全寫入文件

捕捉異常:app

1
2
3
4
5
6
7
8
9
10
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()

# 等效的簡單寫法,沒必要調用close()
with open('/path/to/file', 'r') as f:
print(f.read())

 

有個read()方法的對象,在Python中統稱爲file-like Object函數


StringIO和BytesIO

StringIO:在內存中讀寫str編碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from io import StringIO

f = StringIO()

# 寫入
f.write('hello')
f.write(' ')
f.write('world!')

# 得到寫入後的str
f.getvalue() # hello world!

####----------------------------------
from io import StringIO

# 用一個str初始化StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')

# 讀取
while True:
s = f.readline()
if s == '':
break
print(s.strip())

 

BytesIO:在內存中讀寫bytesspa

1
2
3
4
5
6
7
8
9
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8')) # 寫入UTF-8編碼的bytes
f.getvalue()

# 用一個bytes初始化BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
# 讀取
f.read()

 


操做文件和目錄

os模塊,表明 操做系統(operating system),包含很是多的函數用於獲取(和修改)本地目錄、文件進程、環境變量等的信息。操作系統

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import os

# 操做系統的類型
os.name
'''
posix ====> Linux、Unix或Mac OS X
nt ====> Windows系統
'''

# 環境變量
os.environ
'''
environ({'PSMODULEPATH': 'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files'.....
'''
# 獲取某個環境變量的值
os.environ.get('PATH')
os.environ.get('x', 'default')
s = os.getenv('PATH')

#################################################
# -------------------目錄操做-------------------#
#################################################

# 獲取當前工做目錄 get current working directory
os.getcwd()

# 改變當前目錄 change directory, 能夠用相對路徑
os.chdir('/Users/pilgrim/diveintopython3/examples')

# 查看當前工做目錄的絕對路徑:
os.path.abspath('.')

# 拼接路徑,此方法能夠正確處理不一樣操做系統的路徑分隔符
# 合併、拆分路徑的函數並不要求目錄和文件要真實存在,它們只對字符串進行操做
os.path.join('F:\\PythonWorkspace', 'NewDir')

# expanduser函數用來將包含~符號(表示當前用戶Home目錄)的路徑擴展爲完整的路徑
os.path.expanduser("~/.pythonrc")
# eg:
os.path.join(os.path.expanduser('~'), 'diveintopython3', 'examples', 'humansize.py')

# 建立新目錄
os.mkdir('F:\\PythonWorkspace\\NewDir')

# 刪除目錄:
os.rmdir('F:\\PythonWorkspace\\NewDir')

# 拆分路徑,此方法能夠正確處理不一樣操做系統的路徑分隔符
os.path.split('F:\\PythonWorkspace\\file.txt') # ('F:\\PythonWorkspace', 'file.txt')

# 獲取文件擴展名
os.path.splitext('F:\\PythonWorkspace\\file.txt') # ('F:\\PythonWorkspace\\file', '.txt')

# 重命名文件:
os.rename('test.txt', 'test.py')

# 刪掉文件:
os.remove('test.py')

# os模塊中不存在複製文件的函數,緣由是複製文件並不是由操做系統提供的系統調用。可使用shutil模塊的copyfile()函數

# 列出當前工做目錄下的全部目錄
# listdir()只返回文件名,不包含完整路徑
# 不在當前目錄下時,isdir必須加上路徑,若是隻傳入文件夾名字,它會在當前工做目錄下搜索是否存在此文件夾
[x for x in os.listdir('.') if os.path.isdir(x)]

# 列出全部的.py文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

 


獲取文件元信息

元信息: 建立時間,最後修改時間,文件大小等等指針

1
2
3
4
5
6
7
8
9
10
11
import os
import time

# os.stat() 函數返回一個包含多種文件元信息的對象
metadata = os.stat('feed.xml')

# 最後修改時間,從紀元(1970年1月1號的第一秒鐘)到如今的秒數
metadata.st_mtime

# time.localtime() 函數將從紀元到如今的秒數轉換成包含年、月、日、小時、分鐘、秒的結構體。
time.localtime(metadata.st_mtime)
相關文章
相關標籤/搜索