讀寫檔案, 檔案備份, 上傳資料這些操作應該是大家日常工作中每天都要做的事情. 而檔案呢, 又有不同的型別(字尾名), 比如 .txt, .xls, .xlsx, .csv, .json, .sql .... 等等各種檔案. 在我日常的資料工作中, 讀取檔案資料, 處理, 寫入檔案這樣的操作幾乎是每天都要做的事情. 我們的從程式設計入門的角度來講, 檔案處理算是乙個最能快速應用到工作的了. 尤其是 不同程式設計的小夥伴, 如果要是學會了檔案處理, 那絕對能大幅度提高工作效率的.
突然想吐槽一下 檔案處理回到正題, 首先還是談下對於 "檔案" 的認識.之間接觸很多的文員小夥伴, 日常辦公, 很大時間都在處理一些**, 文件之類的, 重複性很高, 然而他們總是去手工乙個個處理, 經常加班還覺得自己很充實...其實在我看來, 就是工作效率低下的自我安慰, 一定程度上. 我真的很想分享給他們, 只要稍微學一點點程式設計, 或有那麼一點點程式設計的思維, 然後求助一下, 比如我, 重複性的工作讓機器來做不更好嗎, 無非就是一些檔案批處理, 什麼合併, 提取特定資料 之類的....
突然想起, 以前營銷專業課上, 有老師分享說, 最難的事情, 莫過於,"把我的思想, 傳輸給你的大腦 和 把我的手伸進你的錢包"
這對我算是乙個靈魂發問.
我認為,檔案就是用來持久化儲存資料的載體.
其實對於檔案的認知, 莫過於 linux 的觀點:一些皆檔案.
接觸或 linux 的小夥伴就非常明白, linux 下, 一切皆是檔案. 乙個程式, 也是乙個檔案, 各種配置檔案等等. 也可以自定義檔案的型別啥的. 都是 open 的, 就是用來儲存資料的載體而已. 當然這也是抽象出來的概念, 就不往下深究了. 舉個栗子, 乙個 win 下的 exe 程式. 它不就是乙個以 .exe 作為字尾的檔案嗎. 裡面儲存的是程式的**.還有我們的資料庫, 它本質也是將資料按特定的規則儲存的檔案而已. 可見檔案在我們生活中扮演了極為重要的角色.
在 python 中, 主要用open()函式來建立檔案物件, 用的兩個庫主要是os 和 pathlib, 這裡主要先講os, 主要是我個人用得熟練一些. 當然也參考 pathlib, 看了官方文件也還蠻強大的.
我通常會先看看, 我當前的工作路徑.
import os
# 檢視當前路徑
os.getcwd()
out[4]: 'e:\\jupyter notes\\python_data_struct'
# 檢視當前路徑下有哪些檔案
os.listdir()
out[3]: ['.git', '.gitignore', '.idea', 'pythonds', 'test.py']
然後讀取檔案, 通常的寫法是這樣的, 用 with 這個上下文管理器.
with open("./test.py", 'r') as f:
f.read()
# 然後各種處理
常用的無非就是這些, 讀, 寫, 和追加嘛.
資料讀取有 3 中方式, 讀取固定長度, 讀取一行, 全讀.
python 的檔案物件, 其實是乙個 "迭代器", 建立的時候並未全部載入記憶體, 用一點, 取一點寫入資料: f.write(string...)
# 全讀
with open("test.py", 'r+') as f:
print(f.read())
123
456'abc', 'def'
'hello'
# 讀取固定長度
with open("test.py", 'r+') as f:
print(f.read(5))
123
4
# 讀取一行
with open("test.py", 'r+') as f:
print(f.readline())
print(f.readline())
123
456
# 以列表方式返回
with open("test.py", 'r+') as f:
print(f.readlines())
f.write("youge")
['123\n', '456\n', "'abc', 'def'\n", "'hello'youge"]
更常見的情景是按行讀, 對每行進行乙個操作.
with open("test.py") as f:
while true:
line = f.readline().strip()
print(line)
if len(line) == 0:
print("---end----")
break
123
456'abc', 'def'
'hello'youge
---end----
case 檔案備份
原理即從 a 檔案 read() 然後 write() 到 b 檔案而已.
def backup_file(file_name):
"""檔案備份"""
try:
# 1. 讀取檔案
cur_file = open(file_name, 'rb')
except exception:
print("未找到該檔案 或 讀取錯誤")
return
# 2. 找到檔案字尾, 先找分割點位置 如 abc.txt 則'.' 的 index = 3
point_index = file_name.rfind('.')
suffix = file_name[point_index +1:]
# 3. 構建新的檔名
new_file_name = file_name[:point_index] + "副本" + suffix
# 4. 將資料寫進新的檔案即可
new_file = open(new_file_name, 'wb')
for line in cur_file.readlines():
new_file.write(line)
print()
print('---正在備份---')
print("備份成功!")
# 關閉檔案
cur_file.close()
new_file.close()
if __name__ == '__main__':
# test
filename = input("請輸入您要備份的檔名(包含字尾哦): \n")
backup_file(filename)
請輸入您要備份的檔名(包含字尾哦):
test.py
---正在備份---
備份成功!
看看手動異常處理:
請輸入您要備份的檔名(包含字尾哦):
fdsdsfsdfsdf
未找到該檔案 或 讀取錯誤
process finished with exit code 0
即定位游標的位置在哪, 工作用這個倒是用得挺少的.
獲取當前游標位置: 用tell()函式即可
f = open('test.py')
# 當前位置
print("position:", f.tell())
print('get data:', f.read(2))
print("position:", f.tell())
print('get data:', f.read(3))
print("position:", f.tell())
f.close()
position: 0
get data: 12
position: 2
get data: 3
4position: 6
定位到某個位置: 用seek()函式即可.
seek(offset, whence). offset 表示偏移量. whence 預設為0, 表示檔案開頭. 1表示當前位置, 2表示檔案末尾.
f = open('test.py')
print('get data:', f.read(2))
print("position:", f.tell())
# 定位到
f.seek(3, 0)
print('position:', f.tell())
f.close()
get data: 12
position: 2
position: 3
上篇就初步認識讀寫檔案就行, 下篇主要是對兩個模組 os, 和 pathlib 進行認識, 配合起來, 檔案的絕大多數操作就沒啥問題了, 然後如果再會用處理點資料, 對於 文員來說, 辦公效率提公升至少 10倍, 在某些固定任務上, 作為過來人的一點認知分享, 真的是這樣子. 異常處理(上)
c 中的異常處理 小結 所有的 都有可能不按照預定義的方式執行 典型問題一 double div double a,double b double add double a,double b double minus double a,double b double multi double a,d...
python 基礎 檔案處理
f open 檔名的路徑 開啟的模式 encoding 字元編碼 f.close 檔案的上下文管理 with flask框架的上下文管理 後期學習 with open 檔名的路徑 開啟的模式 encoding 字元編碼 as f 內部幫你執行f.close 作業系統提供的虛擬概念,用來儲存資訊的 開...
python基礎 檔案處理
open函式 開啟乙個檔案,返回控制代碼,相關的方法才可以呼叫它進行讀寫。開啟後必選使用close函式,否則記憶體會爆 def open file,mode r buffering none,encoding none,errors none,newline none,closefd true fi...