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

python file processing

編輯:Python

一 文件操作

一 介紹

計算機系統分為:計算機硬件,操作系統,應用程序三部分.

我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件,眾所周知,應用程序是無法直接操作硬件的,This is used in the operating system.操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中File is the operating system to provide the application to operate the hard disk virtual concept,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來.

有了文件的概念,我們無需再去考慮操作硬盤的細節,只需要關注操作文件的流程:

#1. 打開文件,得到文件句柄並賦值給一個變量

#2. 通過句柄對文件進行操作
#3. 關閉文件
  • 1.
  • 2.
  • 3.

二 在python中

#1. 打開文件,得到文件句柄並賦值給一個變量

f=open('a.txt','r',encoding='utf-8') #默認打開模式就為r

#2. 通過句柄對文件進行操作
data=f.read()

#3. 關閉文件
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

三 f=open('a.txt','r')的過程分析

#1、由應用程序向操作系統發起系統調用open(...)


#2、操作系統打開該文件,並返回一個文件句柄給應用程序

#3、應用程序將文件句柄賦值給變量f
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

四 強調!!!

#Emphasis on the first point:

打開一個文件包含兩部分資源:操作系統級打開的文件+應用程序的變量.在操作完畢一個文件時,必須把與該文件的這兩部分資源一個不落地回收,回收方法為:
1、f.close() #回收操作系統級打開的文件
2、del f #回收應用程序級的變量

其中del f一定要發生在f.close()之後,否則就會導致操作系統打開的文件還沒有關閉,白白占用資源,
而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢文件後,一定要記住f.close()

雖然我這麼說,But many students will still be very shameless to forgetf.close(),For these don't long brain classmate,We recommend the fool operation mode:使用with關鍵字來幫我們管理上下文
with open('a.txt','w') as f:
pass

with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
#Emphasis on the second point:

f=open(...)是由操作系統打開文件,那麼如果我們沒有為open指定編碼,那麼打開文件的默認編碼很明顯是操作系統說了算了,操作系統會用自己的默認編碼去打開文件,在windows下是gbk,在linux下是utf-8.
這就用到了上節課講的字符編碼的知識:若要保證不亂碼,文件以什麼方式存的,就要以什麼方式打開.

f=open('a.txt','r',encoding='utf-8')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

五 python2中的file與open

#首先在python3There is only one operating file selection,那就是open()


#而在python2There are two ways to:file()與open()
Both are able to open the file,對文件進行操作,Also have similar usage, and parameters,但是,The two file open mode has essential difference between,fileAs a file class,用file()來打開文件,The equivalent of this is in the structure file class,而用open()打開文件,是用pythonThe built-in functions to operate,我們一般使用open()Open the file to operate,而用fileAs a type of,比如type(f) is
  • 1.
  • 2.
  • 3.
  • 4.

模式可以是以下方式以及他們之間的組合:

字符

意義

‘r'

open for reading (default)  打開讀取(默認)

‘w'

open for writing, truncating the file first  打開以寫入,首先截斷文件

‘a'

open for writing, appending to the end of the file if it exists  Open for writing,如果文件存在,則追加到文件末尾

‘b'

binary mode  二進制

‘t'

text mode (default)  文本模式(默認)

‘+'

open a disk file for updating (reading and writing)  打開磁盤文件進行更新(讀取和寫入)

‘U'

universal newline mode (for backwards compatibility; should not be used in new code)  通用換行模式(用於向後兼容;不應在新代碼中使用)

#1. 打開文件的模式有(默認為文本模式):

r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則創建;存在則清空內容】
a, 之追加寫模式【不可讀;不存在則創建;存在則只追加內容】

#2. 對於非文本文件,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb
wb
ab
注:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼

#3. 了解部分
"+" 表示可以同時讀寫某個文件
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】


x, 只寫模式【不可讀;不存在則創建,存在則報錯】
x+ ,寫讀【可讀,可寫】
xb
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.


# U模式
'U' mode is deprecated and will raise an exception in future versions
of Python. It has no effect in Python 3. Use newline to control
universal newlines mode.

# 總結:
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

三 操作文件的方法

#掌握

f.read() #讀取所有內容,光標移動到文件末尾
f.readline() #讀取一行內容,光標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中

f.write('1111\n222\n') #針對文本模式的寫,需要自己寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,需要自己寫換行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#了解
f.readable() #文件是否可讀
f.writable() #文件是否可讀
f.closed #文件是否關閉
f.encoding #如果文件打開模式為b,則沒有該屬性
f.flush() #立刻將文件內容從內存刷到硬盤
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

練習,利用b模式,編寫一個cp工具,要求如下:

1. 既可以拷貝文本又可以拷貝視頻,圖片等文件

2. 用戶一旦參數錯誤,打印命令的正確使用方法,如usage: cp source_file target_file

提示:可以用import sys,然後用sys.argv獲取腳本後面跟的參數

import sys

if len(sys.argv) != 3:
print('usage: cp source_file target_file')
sys.exit()

source_file,target_file=sys.argv[1],sys.argv[2]
with open(source_file,'rb') as read_f,open(target_file,'wb') as write_f:
for line in read_f:
write_f.write(line)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

四 文件內光標移動

一: read(3):

1. 文件打開方式為文本模式時,代表讀取3個字符

2. 文件打開方式為b模式時,代表讀取3個字節

二: 其余的文件內光標移動都是以字節為單位如seek,tell,truncate

注意:

1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的

2. truncate是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate要在r+或a或a+等模式下測試效果

import time

with open('test.txt','rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if line:
print(line.decode('utf-8'))
else:
time.sleep(0.2)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

五 文件的修改

文件的數據是存放於硬盤上的,因而只存在覆蓋、不存在修改這麼一說,我們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:

方式一:將硬盤存放的該文件的內容全部加載到內存,在內存中是可以修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)

import os


with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部讀入內存,如果文件很大,會很卡
data=data.replace('alex','SB') #在內存中完成修改

write_f.write(data) #一次性寫入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最後用新文件覆蓋源文件

import os


with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f:
line=line.replace('alex','SB')
write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

練習題:

1. 文件a.txt內容:每一行內容分別為商品名字,價錢,個數,Calculate the total amount from the shopping

apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3

2. 修改文件內容,把文件中的alex都替換成SB
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

 




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