程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python學習筆記_Day03

編輯:Python

文件對象

操作步驟:

  1. 打開
  2. 讀寫
  3. 關閉

讀取文本文件

(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()

以bytes方式讀取文件

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語句結束後,文件自動關閉。

>>> 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()

以上代碼存在的問題

  • 盡量使用變量,不要直接使用'/bin/ls'這樣的直接量
  • 變量名應該有意義,f1和f2這樣的名稱沒有意義
  • 讀取數據時,一次將全部內容讀入,有可能數據量太大

函數

給一段代碼起個名。假如有一個功能,需要10行代碼,而這個功能需要在5個地方重復使用。可以將這些功能代碼封裝到函數中,以後需要用到這個功能,就調用函數。

函數定義時,代碼不會執行。調用函數時,函數內的代碼才會執行。

函數的返回值

  • 函數執行的結果,可以使用return進行返回
  • 如果函數沒有return語句,默認返回None
  • 當函數遇到return語句時,函數將會返回結果,停止執行

函數的參數

  • 函數需要處理的數據,一般是通過參數進行傳遞的
  • 定義函數時,參數值不確定,用一個名稱進行占位,稱作形式參數、形參
  • 函數調用時,將具體的數據傳遞給函數,這個具體的數據是實際使用的參數,稱作實際參數、實參
  • 形參賦值給實參時,認為是變量賦值即可
  • 函數內部的參數、變量都是局部變量,只在函數內可用。

位置參數

  • 在python中,位置參數保存在sys模塊的argv列表中
  • 位置參數都以字符形式傳遞
(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'

模塊

  • 一個以.py作為結尾的python程序文件就是一個模塊
  • 模塊的命名要求
  • 首字符只能是字母或下劃線
  • 其他字符可以是字母、數字、下劃線
  • 區分大小寫
  • 模塊名是python程序文件名去除.py後前面的部分
# 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()

模塊的特性

  • 每個模塊文件都有一個特殊的變量叫__name__
  • 它的值可以是__main__,也可以是模塊名
  • 當模塊文件直接運行時,是__main__
  • 當模塊間接運行(被import導入)時是模塊名
(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'之下的代碼塊不被運行。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved