# Python文件的基礎操作(2) - 二進位模式下讀寫操作 - 練習 - 控制文件內指針(游標)的移動 - 文件的修改 - 函數的介紹 ## 練習 ```python # 小練習: 編寫拷貝工具 1. 讓用戶輸入被拷貝的文件路徑(源文件路徑) 2. 輸入即將要拷貝的文件路徑(目標文件路徑) 3. ...
Python文件的基礎操作(2)
- 二進位模式下讀寫操作
- 練習
- 控制文件內指針(游標)的移動
- 文件的修改
- 函數的介紹
練習
# 小練習: 編寫拷貝工具
1. 讓用戶輸入被拷貝的文件路徑(源文件路徑)
2. 輸入即將要拷貝的文件路徑(目標文件路徑)
3. 以讀的模式打開源文件,以寫的模式打開目標文件
source_file_path = input('請輸入待拷貝的文件路徑:').strip()
dst_file_path = input('請輸入目標文件的路徑:').strip()
with open(r'%s' % source_file_path, 'rb') as read_f:
with open(r'%s' % dst_file_path, 'wb') as write_f:
for line in read_f:
write_f.write(line)
二進位模式下讀寫的操作
#大前提:文件內指針的移動都是Bytes為單位的,唯一例外的是t模式下的read(n),n以字元為單位
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read(3) # 讀取3個字元
with open('a.txt',mode='rb') as f:
data=f.read(3) # 讀取3個Bytes
# 之前文件內指針的移動都是由讀/寫操作而被動觸發的,若想讀取文件某一特定位置的數據,則則需要用f.seek方法主動控制文件內指針的移動,詳細用法如下:
# f.seek(指針移動的位元組數,模式控制):
# 模式控制:
# 0: 預設的模式,該模式代表指針移動的位元組數是以文件開頭為參照的
# 1: 該模式代表指針移動的位元組數是以當前所在的位置為參照的
# 2: 該模式代表指針移動的位元組數是以文件末尾的位置為參照的
# 強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
t模式下:
f.read() 如果不指定參數,預設情況下是一次性讀取所有
f.read(5) 如果指定了參數,返回的就是字元個數
b模式下:
f.read(5) 如果指定了參數,返回的就是位元組個數
如果文件中有中文字元,切記書寫的數字要是3的倍數,如果有中文也有英文字元,這個數字需要計算了
指針:就可以理解成游標的移動
# with open('a.txt', 'r', encoding='utf-8') as f:
# print(f.read(5)) # 你helloworld
# f.seek(3, 1)
# print(f.read())
# # print(f.read(5))
# # print(f.read())
with open('a.txt', 'rb') as f:
print(f.read(2)) # helloworld
f.seek(-3, 2)
print(f.read())
# print(f.read(5))
# print(f.read())
"""
f.seek()
offset: int,
代表的是移動的偏移量
如果是正數,就往右邊移
如果是負數,就往左邊以----------》左邊要可移動
"""
# 小練習:實現動態查看最新一條的效果
# 小練習:實現動態查看最新一條日誌的效果
import time # 導入的一個時間模塊
# linux裡面的一條命令:tail -f access.log
with open('access.log', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 沒有內容
time.sleep(0.5) # 睡眠0.5秒
else:
print(line.decode('utf-8'), end='')
文件修改
mode='r+'
mode='w+t'
mode='a+t'
# 可讀可寫
# 可讀可寫
# 可讀可寫
1. 硬碟中得數據是不允許直接修改的
2. 記憶體中得數據是可以直接修改的
a.txt
kevinkevin 山東 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
'''方式一:'''
# 1. 讀取文件內的所有數據
# 快捷鍵:shift+enter
with open('a.txt', 'r', encoding='utf-8') as f:
data = f.read()
print(data)
# 2. 讀取完字元之後,做字元替換
with open('a.txt', 'wt', encoding='utf-8') as f:
f.write(data.replace('kevin', 'kevinSB'))
'''方式2:'''
import os
with open('a.txt',mode='rt',encoding='utf-8') as read_f, \
open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
函數的介紹
函數的語法
def 函數名(參數1,參數2,...):
"""文檔描述"""
函數體
return 值
"""
1. def 就是定義函數的關鍵字,它不能夠省略,必須寫
2. my_len():函數名,函數名的命名遵循變數的命名規範,他也是必填的,不能省略的,括弧不能省略
3. a, b稱為是函數的參數,是可選的,可有可無
參數就是執行函數的一些前提條件
4. '''函數註釋'''
註釋不參與函數的執行,只起到函數功能的提示作用,以及各個參數是什麼意思
# 可有可無的,但是,推薦每個函數都加上函數註釋
5. # 函數體
才是函數的核心,它是函數所具備的核心功能,應該是必須有的,pass
沒有函數體的函數是沒有意義的函數,一般情況都是要有函數體的
6. 返回值 return 函數的返回值
# 返回值也是可選的,可以有返回值,也可以沒有返回值,但是一般情況下都要有返回值
# 一個函數只能有一個返回值...
"""
函數的定義與調用
1. 函數必須先定義後調用,沒有定義函數是一定不能夠調用的
2. 函數在定義階段,只檢測語法是否錯誤,不檢測邏輯是否有問題
3. 邏輯上的錯誤只會在調用階段檢測
4. 函數一定是被調用之後才會執行函數內部的代碼塊,不調用函數一定不會執行函數的
# 如何調用函數
函數名() # 只要函數名加括弧一定會執行函數體代碼
函數如果在定義階段有參數,那麼,在調用的時候,連參數一塊寫上
函數調用的內部原理:
1. 先在記憶體空間中申請一塊空間地址來存儲函數體代碼
2. 把函數名和函數體所在的空間地址綁定在一起
3. 以後只需要通過函數名()來訪問函數體代碼即可
函數的類型
1. 內置函數
# Python解釋器中原本就存在的,可以直接拿來使用,無需定義,直接調用
len print input 之前學習的數據類型的各個方法
2. 自定義函數
# 程式員自己寫的函數,就必須先定義後調用
1. 無參函數:函數在定義階段沒有參數
def my_len():
pass
my_len()
2. 有參函數:在函數定義階段有參數的存在
def my_len(a, b):
pass
my_len(1, 2)
3. 空函數
def my_len():
pass
"""作用就在於可以幫助我們梳理業務邏輯"""