Python基礎 檔案處理 上

2022-05-06 20:33:09 字數 4848 閱讀 9664

讀寫檔案, 檔案備份, 上傳資料這些操作應該是大家日常工作中每天都要做的事情. 而檔案呢, 又有不同的型別(字尾名), 比如 .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...