一篇文章让你搞懂,Python文件操作
一、基本操作
基于字符的讀取(r),寫入(w)與追加(a)
1.mode=‘r’
2.mode=‘w’
f = open(file='文件寫入.txt', mode='w') f.write('謝欣然 湖北 保密 保密')write模式下,將數(shù)據(jù)寫入文件時(shí),文件原有數(shù)據(jù)會(huì)被清空,即創(chuàng)建一個(gè)新文件以寫入數(shù)據(jù)
3.mode=‘a(chǎn)’
f = open(file='文件寫入.txt', mode='a') f.write('xxr 湖北 保密 保密')在文件close之前,寫入的數(shù)據(jù)暫時(shí)存在內(nèi)存里,文件close之后才將數(shù)據(jù)追加到硬盤上。若不close文件,也可用flush刷新硬盤上的文件,此時(shí)新加入的數(shù)據(jù)已顯示在原來(lái)的文件數(shù)據(jù)之后。
4.打開(kāi)文件時(shí)會(huì)出現(xiàn)的編碼錯(cuò)誤
報(bào)錯(cuò):UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xac in position 9: illegal multibyte sequence
原因:mac/linux系統(tǒng)編碼為utf-8,windows系統(tǒng)編碼為gbk,在Windows上打開(kāi)mac/linux電腦傳過(guò)來(lái)的文件時(shí),會(huì)出現(xiàn)文件編碼錯(cuò)誤
解決方案:此時(shí)在代碼開(kāi)頭加上# - - utf-8 - -并沒(méi)有用,需在open(file)中加上編碼方式encoding=utf-8
錯(cuò)誤代碼:
f = open(file='文件錯(cuò)誤.txt', mode='r') print(f.read())正確代碼:
f = open(file='文件錯(cuò)誤.txt', mode='r', encoding='utf-8') print(f.read())二、區(qū)分read(), readline(), readlines()
1.read([size])
從文件的開(kāi)始位置讀取size個(gè)字節(jié)的內(nèi)容,如果read()中沒(méi)有帶參數(shù)的話那么就是讀取至整個(gè)文件結(jié)束,所以比較適合小型文件,把讀取的東西放在一個(gè)字符串中,返回的是一個(gè)字符串。
f = open(file='文件讀取.txt', mode='r') print(f.read(10)) print('--------分隔符--------') print(f.read())f.close()''' 輸出: --------分隔符--------廣州 173 50 喬亦菲 廣州 172 52 羅夢(mèng)竹 北京 175 49 劉諾涵 北京 170 48 岳妮妮 廣州 177 54 賀婉萱 廣州 174 52 葉梓萱 上海 171 49 黑姑娘 河北 168 48'''2.readline()
readline讀取一行的意思,利用循環(huán)可以一行一行的讀取,比較適合大型文件成千上百行的那種,此方法返回一個(gè)字符串對(duì)象。
f = open(file='文件讀取.txt', mode='r') print('--------分隔符--------') lines = f.readline() while lines:print(lines.strip())# print自帶換行# strip用于移除字符串頭尾指定的字符(默認(rèn)為空格或換行符)或字符序列。lines = f.readline() f.close()''' 輸出: --------分隔符-------- Alex馬大帥 廣州 173 50 喬亦菲 廣州 172 52 羅夢(mèng)竹 北京 175 49 劉諾涵 北京 170 48 岳妮妮 廣州 177 54 賀婉萱 廣州 174 52 葉梓萱 上海 171 49 黑姑娘 河北 168 48'''3.readlines()
這個(gè)方法是讀取文件的所有行,把結(jié)果保存在一個(gè)列表(list)中,每一行都作為列表的一個(gè)元素,不適合讀取成千上萬(wàn)行的文件,因?yàn)榭赡軙?huì)卡死也會(huì)比較占內(nèi)存。但讀取整個(gè)文件到一個(gè)迭代器方便我們遍歷(即讀取到一個(gè)list中,以供使用,比較方便)。
f = open(file='文件讀取.txt', mode='r') print('--------分隔符--------') print(f.readlines())f.close() ''' --------分隔符-------- ['Alex馬大帥 廣州 173 50\n', '喬亦菲 廣州 172 52\n', '羅夢(mèng)竹 北京 175 49\n', '劉諾涵 北京 170 48\n', '岳妮妮 廣州 177 54\n', '賀婉萱 廣州 174 52\n', '葉梓萱 上海 171 49\n', '黑姑娘 河北 168 48\n']'''補(bǔ)充:根據(jù)條件查詢文件信息
輸出:身高大于170,體重小于50的成員信息
f = open(file='文件讀取.txt', mode='r') for line in f:line = line.split()height = int(line[2])weight = int(line[3])if height > 170 and weight < 50:print(line)f.close() ''' ['羅夢(mèng)竹', '北京', '175', '49'] ['葉梓萱', '上海', '171', '49']'''三、文件操作的其他功能
1.seek(offset)
把操作文件的光標(biāo)移動(dòng)到指定位置,返回值為None,即無(wú)返回值。
offset:開(kāi)始的偏移量,也就是代表需要移動(dòng)偏移的字節(jié)數(shù)。
注意:seek的長(zhǎng)度是按字節(jié)算的,字符編碼存每個(gè)字符所占的字節(jié)長(zhǎng)度不一樣。如漢字,用gbk存是2個(gè)字節(jié)一個(gè)字,用utf-8就是3個(gè)字節(jié)一個(gè)字。只能按整長(zhǎng)度截取,否則報(bào)錯(cuò)。
# 修改文件 f = open('文件寫入.txt', 'r+') # 注意r+的添加是從當(dāng)前指針開(kāi)始添加,所以要添加到尾部 # 一定要f.read()從頭到尾讀一遍,不然就是從頭到為開(kāi)始覆蓋 f.seek(2) f.write('小新') ''' 此修改文件會(huì)對(duì)原文件進(jìn)行覆蓋,即插入后會(huì)覆蓋之后的數(shù)據(jù) '''2.tell()
返回當(dāng)前文件操作光標(biāo)的位置
3.flush()
把文件從內(nèi)存buffer里強(qiáng)制到硬盤。在文件close之前,寫入的數(shù)據(jù)暫時(shí)存在內(nèi)存里,文件close之后才將數(shù)據(jù)追加到硬盤上。若不close文件,也可用flush刷新硬盤上的文件,此時(shí)新加入的數(shù)據(jù)已顯示在原來(lái)的文件數(shù)據(jù)之后。
4.os.rename與os.replace
關(guān)于Windows系統(tǒng)下,用os.rename替換文件時(shí)出現(xiàn)的坑:
import os #學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:711312441 old_file = '修改文件.txt' new_file = '修改文件2.txt' f = open(file=old_file, mode='r', encoding='utf-8') f_new = open(new_file, 'w') old_str = '深圳' new_str = '廣州'for line in f:if old_str in line:line = line.replace(old_str, new_str)f_new.write(line)f.close() f_new.close()os.rename(new_file, old_file) # 此行錯(cuò)誤報(bào)錯(cuò):FileExistsError: [WinError 183] 當(dāng)文件已存在時(shí),無(wú)法創(chuàng)建該文件。: ‘修改文件2.txt’ -> ‘修改文件.txt’
原因:Windows系統(tǒng),在同一個(gè)文件夾內(nèi),無(wú)法命名一個(gè)相同文件名的文件。iOS與Linux可以直接重命名,并會(huì)替換掉之前的文件。
解決方案:將rename改為replace
5.占硬盤的方式修改文件
用占硬盤的方式修改文件可以不進(jìn)行覆蓋,進(jìn)行整體修改。如word,vim,不在硬盤上修改,把內(nèi)容全部讀到內(nèi)存里,數(shù)據(jù)可以在內(nèi)存里增刪改查,修改之后,把內(nèi)容再全部寫回硬盤,把原來(lái)的數(shù)據(jù)全都覆蓋掉。
old_file = '修改文件.txt' new_file = '修改文件2.txt' f = open(file=old_file, mode='r', encoding='utf-8') f_new = open(new_file, 'w') old_str = '深圳' new_str = '廣州'for line in f:if old_str in line:line = line.replace(old_str, new_str)f_new.write(line)f.close() f_new.close()此方法生成一個(gè)新文件“修改文件2”,存在硬盤里,若想覆蓋原文件:
import osold_file = '修改文件.txt' new_file = '修改文件2.txt' f = open(file=old_file, mode='r', encoding='utf-8') f_new = open(new_file, 'w') old_str = '深圳' new_str = '廣州'for line in f:if old_str in line:line = line.replace(old_str, new_str)f_new.write(line)f.close() f_new.close()os.replace(new_file, old_file)6.sys argv[]
sys argv[]是一個(gè)從程序外部獲取參數(shù)的橋梁,即從終端(命令行)獲取參數(shù)。從外部取得的參數(shù)可以是多個(gè),所以獲得的是一個(gè)列表(list),也就是說(shuō)sys.argv其實(shí)可以看作是一個(gè)列表,所以才能用[]提取其中的元素。 其第一個(gè)元素是程序本身,隨后才依次是外部給予的參數(shù)。
import sysprint(sys.argv)從Pycharm的Terminal終端輸入輸出結(jié)果:
''' C:\Users\Administrator\Desktop\新建文件夾>python 4.py ['4.py']C:\Users\Administrator\Desktop\新建文件夾>python 4.py Hello world! ['4.py', 'Hello', 'world!'] '''7.open with告別文件開(kāi)關(guān)繁瑣操作
文件用open打開(kāi)后就一定要關(guān)閉(close),而使用with打開(kāi)就可以不需加上close。
原代碼:
file = open('1.txt', 'w') file.write('簡(jiǎn)單明了,省時(shí)省力') file.close()改進(jìn)后的代碼:
with open('1.txt', 'w') as file:file.write('簡(jiǎn)單明了,省時(shí)省力')open也可進(jìn)行多個(gè)文件的同時(shí)打開(kāi):
with open('a.txt','r',encoding='utf-8') as f,open('b.txt') as f1:f.write('簡(jiǎn)單明了,省時(shí)省力')f1.write('簡(jiǎn)單明了,省時(shí)省力')總結(jié)
以上是生活随笔為你收集整理的一篇文章让你搞懂,Python文件操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机能连上手机热点却无法连上无线网络,
- 下一篇: 【Bilibili视频嵌入技巧】如何嵌入