(nsd1903) [[email protected] day02]# cp /etc/passwd /tmp/
>>> f = open('/tmp/passwd') # 打開文件
>>> data = f.read() # 默認讀取全部內容
>>> data
>>> print(data)
>>> data = f.read()
>>> data
''
>>> f.close() # 關閉文件
>>> f = open('/tmp/passwd')
>>> f.read(4) # 讀取4字節
'root'
>>> f.read(3)
':x:'
>>> f.readline() # 讀取一行
'0:0:root:/root:/bin/bash\n'
>>> f.readline()
'bin:x:1:1:bin:/bin:/sbin/nologin\n'
>>> f.readlines() # 將所有行讀出來,放到列表中,每行是列表的一項
>>> f.close()
# 讀文本文件使用最多的方式是for循環
>>> f = open('/tmp/passwd')
>>> for line in f:
... print(line, end='')
>>> f.close()
1個16進制數,正好對應4位2進制:
0b0000 <-> 0x0
0b1111 <-> 0xF
讀取任何文件都可以用bytes方式打開。讀取文件內容時,如果是文本內容,將會以字符的形式顯示,如果不能轉成字符,將會直接顯示16進制數。
>>> f = open('/tmp/passwd', 'rb')
>>> f.read(4)
b'root'
>>> f.close()
>>> f = open('/bin/ls')
>>> f.read(10) # 讀取時,python試圖將內容轉換成字符,但是失敗了,報錯
>>> f.close()
>>> f = open('/bin/ls', 'rb')
>>> f.read(10)
b'\x7fELF\x02\x01\x01\x00\x00\x00'
>>> f.close()
>>> f = open('/tmp/passwd', 'w') # 創建或清空文件
>>> f.write('hello world!\n') # \n表示換行
13 # 表示共寫入了13字節
>>> f.flush() # 默認數據寫到緩存,不會立即同步至磁盤,flush()立即寫入磁盤
>>> f.writelines(['2nd line.\n', '3rd line.\n'])
>>> f.close() # 關閉文件,數據也會同步到磁盤
使用with打開文件,with語句結束後,文件自動關閉。
>>> with open('/tmp/passwd') as f:
... for line in f:
... print(line, end='')
>>> f = open('/tmp/passwd', 'rb')
>>> f.tell() # 返回文件指針位置,從文件開頭到文件指針間的偏移量
0
>>> f.read(5)
b'hello'
>>> f.tell()
5
>>> f.seek(0, 0) # 移動指針到文件開頭
# seek第二個參數是相對位置,0表示開頭,1表示當前位置,2表示結尾;第一個參數是偏移量
>>> f.seek(-6, 2) # 移動指針到文件結尾前的第6個位置
>>> f.close()
練習:拷貝文件
# 初步實現
f1 = open('/bin/ls', 'rb')
f2 = open('/tmp/ls', 'wb')
data = f1.read()
f2.write(data)
f1.close()
f2.close()
以上代碼存在的問題
給一段代碼起個名。假如有一個功能,需要10行代碼,而這個功能需要在5個地方重復使用。可以將這些功能代碼封裝到函數中,以後需要用到這個功能,就調用函數。
函數定義時,代碼不會執行。調用函數時,函數內的代碼才會執行。
(nsd1903) [[email protected] day03]# cat pos.py
import sys
print(sys.argv)
(nsd1903) [[email protected] day03]# python pos.py hao 123
['pos.py', 'hao', '123']
為函數提供了默認值的參數。
>>> def pstar(n=30):
... print('*' * n)
...
>>> pstar(20)
********************
>>> pstar(50)
**************************************************
>>> pstar()
******************************
函數練習1:
s1 = ' hello world'
函數練習2:
s1 = 'a12bcd89xf2340ll'
# vim star.py
"""星星模塊
該模塊包含了一個全局變和一個函數
"""
hi = 'Hello World'
def pstar(n=30):
"默認打印30個星號"
print('*' * n)
# python3
>>> import star
>>> help(star)
>>> star.hi
'Hello World'
>>> star.pstar()
******************************
# 直接導入
>>> import time
>>> time.strftime('%Y-%m-%d')
'2019-08-02'
# 導入多個模塊,不推薦
>>> import sys, os, datetime
# 只導入模塊中的某些功能
>>> from random import randint, choice
>>> randint(1, 100)
81
>>> choice('+-*/')
'/'
# 導入模塊時,為它起別名
>>> import getpass as gp
>>> gp.getpass()
(nsd1903) [[email protected] day03]# cat foo.py
print(__name__)
(nsd1903) [[email protected] day03]# cat bar.py
import foo
(nsd1903) [[email protected] day03]# python foo.py
__main__
(nsd1903) [[email protected] day03]# python bar.py
foo
在書寫python文件的時候,經常用到 if __name__ == '__main__'
if __name__ == '__main__'的意思是:
當.py文件被直接運行時,if name == 'main'之下的代碼塊將被運行; 當.py文件以模塊形式被導入時,if name == 'main'之下的代碼塊不被運行。