日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pom.xml文件第一行报错_Python文件读写指南

發布時間:2025/3/15 python 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pom.xml文件第一行报错_Python文件读写指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:豌豆花下貓,某985高校畢業生, 兼具極客思維與人文情懷 。公眾號【Python貓】, 專注python技術、數據科學和深度學習,力圖創造一個有趣又有用的學習分享平臺。

對于初學者來說,一份詳盡又清晰明白的指南很重要。今天,貓貓跟大家一起,好好學習Python文件讀寫的內容,這部分內容特別常用,掌握后對工作和實戰都大有益處。學習是循序漸進的過程,欲速則不達。文章較長,建議大家收藏,以備復習查閱哦。

1、如何將列表數據寫入文件?
2、如何從文件中讀取內容?
3、多樣需求的讀寫任務
4、從with語句到上下文管理器

如何將列表數據寫入文件?

首先,我們來看看下面這段代碼,并思考:這段代碼有沒有問題,如果有問題的話,要怎么改?

li?=?['python','?is','?a','?cat']
with?open('test.txt','w')?as?f:
????f.write(li)

現在公布答案,這段代碼會報錯:

TypeError??Traceback?(most?recent?call?last)
input-6-57e0c2f5a453>?in?<module>()1?with?open('test.txt','w')?as?f:---->?2?????f.write(li)
TypeError:?write()?argument?must?be?str,?not?list

以上代碼的想法是將list列表內容寫入txt文件中,但是報錯 TypeError: write() argument must be str。就是說,write()方法必須接受字符串(str)類型的參數。

Python中內置了str()方法,可以返回字符串版本的對象(Return a string version of object)。所以,上面的例子中,我們試試把 f.write(li) 改為 f.write(str(li)) ,先做一下字符串類型的轉化看看。代碼略。

這次沒有報錯了,但是打開文件就傻眼了吧,寫入的內容是“['python',' is',' a',' cat']”。怎么才能寫成“python is a cat”呢?

文件寫操作還有一個writelines()方法,它接收的參數是由字符串組成的序列(sequence),實際寫入的效果是將全部字符串拼接在一起。字符串本身也是一種序列,所以當參數是字符串的時候,writelines()方法等價于write()。

#?以下3種寫法等價,都是寫入字符串“python?is?a?cat”
In?[20]:??with?open('test.txt','w')?as?f:
????...:??????f.writelines(['python','?is','?a','?cat'])
????...:??????f.writelines('python?is?a?cat')
????...:??????f.write('python?is?a?cat')

#?以下2種寫法等價,都是寫入列表的字符串版本“['python','?is','?a','?cat']”
In?[21]:??with?open('test.txt','w')?as?f:
????...:??????f.write(str(['python','?is','?a','?cat']))
????...:??????f.writelines(str(['python','?is','?a','?cat']))

#?作為反例,以下寫法都是錯誤的:
In?[22]:??with?open('test.txt','w')?as?f:
????...:??????f.writelines([2018,'is','a','cat'])?#?含非字符串
????...:??????f.write(['python','is','a','cat'])?#?非字符串

由上可知,當多段分散的字符串存在于列表中的時候,要用writelines()方法,如果字符串是一整段,那直接使用write()方法。如果要以整個列表的形式寫入文件,就使用str()方法做下轉化。

這個問題還沒結束,如果列表中就是有元素不是字符串,而且要把全部元素取出來,怎么辦呢?

那就不能直接使用write()和writelines()了,需要先用for循環,把每個元素取出來,逐一str()處理。

In?[37]:?content=[1,'?is','?everything']
In?[38]:?with?open('test.txt','w')?as?f:
????...:?????for?i?in?content:
????...:?????????f.write(str(i))

需要注意的是,writelines()不會自動換行。如果要實現列表元素間的換行,一個辦法是在每個元素后面加上換行符“\n”,如果不想改變元素,最好是用for循環,在寫入的時候加在末尾:for i in content: ?f.writelines(str(i)+“\n”).

引申一下,經過實驗,數字及元祖類型也可以作為write()的參數,不需轉化。但是dict字典類型不可以,需要先用str()處理一下。字典類型比較特殊,最好是用json.dump()方法寫到文件。

總結一下,write()接收字符串參數,適用于一次性將全部內容寫入文件;writelines()接收參數是由字符串組成的序列,適用于將列表內容逐行寫入文件。str()返回Python對象的字符串版本,使用需注意。

如何從文件中讀取內容?

從文件中讀取內容有如下方法:

file.read([size])
從文件讀取指定的字節數,如果未給定或為負則讀取所有。

file.readline([size])
讀取整行,包括 "\n" 字符。

file.readlines([sizeint])
讀取所有行并返回列表,若給定sizeint>0,則是設置一次讀多少字節,這是為了減輕讀取壓力。

簡而言之,在不傳參數的情況下,read()對應write(),讀取全部內容;readlines()對應writelines(),讀取全部內容(含換行符)并以列表形式返回,每個換行的內容作為列表的一個元素。

In?[47]:?with?open('test.txt','r')?as?f:
????...:?????print(f.read())
1?is?everything.
python?is?a?cat.
this?is?the?end.

In?[48]:?with?open('test.txt','r')?as?f:
????...:?????print(f.readlines())
['1?is?everything.\n',?'python?is?a?cat.\n',?'this?is?the?end.']

但是,以上兩個方法有個缺點,當文件過大的時候,一次性讀取太多內容,會對內存造成極大壓力。讀操作還有一個readline()方法,可以逐行讀取。

In?[49]:?with?open('test.txt','r')?as?f:
????...:?????print(f.readline())
1?is?everything.

readline()讀取第一行就返回,再次調用f.readline(),會讀取下一行。

這么看來,readline()太笨拙了。那么,有什么辦法可以優雅地讀取文件內容呢?

回過頭來看readlines()方法,它返回的是一個列表。這不奇怪么,好端端的內容為啥要返回成列表呢?

再想想writelines()方法,把字符串列表寫入文件正是這家伙干的事,readlines()方法恰恰是它的逆操作!而writelines()方法要配合for循環,所以我們把readlines()與for循環結合,看看會怎樣。

In?[61]:?with?open('test.txt','r')?as?f:
????...:?????for?line?in?f.readlines():
????...:?????????print(line)
1?is?everything.

python?is?a?cat.

this?is?the?end.

#?讀取內容包含換行符,所以要strip()去掉換行符
In?[62]:?with?open('test.txt','r')?as?f:
????...:?????for?line?in?f.readlines():
????...:?????????print(line.strip())
1?is?everything.
python?is?a?cat.
this?is?the?end.

總結一下,readline()比較雞肋,不咋用;read()適合讀取內容較少的情況,或者是需要一次性處理全部內容的情況;而readlines()用的較多,比較靈活,因為for循環是一種迭代器,每次加載部分內容,既減少內存壓力,又方便逐行對數據處理。

多樣需求的讀寫任務

前兩部分講了文件讀寫的幾大核心方法,它們能夠起作用的前提就是,需要先打開一個文件對象,因為只有在文件操作符的基礎上才可以進行讀或者寫的操作。

打開文件用的是open()方法,所以我們再繼續講講這個方法。open() 方法用于打開一個文件,并返回文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

open()方法的參數里file(文件)是必需的,其它參數最常用的是mode(模式)和encoding(編碼)。

先說說encoding,一般來說,打開文件的編碼方式以操作系統的默認編碼為準,中文可能會出現亂碼,需要加encoding='utf-8'。

In?[63]:?with?open('test.txt','r')?as?f:
????...:?????for?line?in?f.readlines():
????...:?????????print(line.strip())
-----------------------
UnicodeDecodeError?????Traceback?(most?recent?call?last)?in?()
??????1?with?open('test.txt','r')?as?f:
---->?2?????for?line?in?f.readlines():
??????3?????????print(line.strip())
UnicodeDecodeError:?'gbk'?codec?can't?decode?byte?0xa4?in?position?26:?illegal?multibyte?sequence
In?[65]:?with?open('test.txt','r',encoding='utf-8')?as?f:
????...:?????for?line?in?f.readlines():
????...:?????????print(line.strip())
愛貓貓
python?is?a?cat.

再說mode,它指定文件打開的模式。

'r': 以只讀模式打開(缺省模式,必須保證文件存在)
'w':以只寫模式打開。若文件存在,則清空文件,然后重新創建;若不存在,則新建
'a':以追加模式打開。若文件存在,則會追加到文件的末尾;若文件不存在,則新建

常見的mode組合
'r'或'rt':? ?默認模式,文本讀模式
'w'或'wt':以文本寫模式打開(打開前文件被清空)
'rb':? ? ? ?以二進制讀模式打開
'ab':? ? ? 以二進制追加模式打開
'wb':? ? ? 以二進制寫模式打開(打開前文件被清空)
'r+':? ? ? ?以文本讀寫模式打開,默認寫的指針開始指在文件開頭, 因此會覆寫文件
'w+':? ? ? 以文本讀寫模式打開(打開前文件被清空)
'a+':? ? ? 以文本讀寫模式打開(只能寫在文件末尾)
'rb+':? ? ?以二進制讀寫模式打開
'wb+':? ?以二進制讀寫模式打開(打開前被清空)
'ab+':? ? 以二進制讀寫模式打開

喵喵,初看起來,模式很多,但是,它們只是相互組合罷了。建議記住最基本的w、r、a,遇到特殊場景,再翻看一下就好了。

從with語句到上下文管理器

基礎部分講完了,下面是進階部分。知其然,更要知其所以然。

1、with語句是初學者必會常識

首先,要解釋一下為啥前文直接就用了with語句。with語句是讀寫文件時的優雅寫法,這已經默認是Python初學者必會的常識了。如果你還不會,先看看用和不用with語句的對比:

#?不用with語句的正確寫法
try:
????f?=?open('test.txt','w')
????f.writelines(['python','?is','?a','?cat'])
finally:
????if?f:
????????f.close()

#?使用with語句的正確寫法
with?open('test.txt','w')?as?f:
????f.writelines(['python','?is','?a','?cat'])

因為文件對象會占用操作系統的資源,并且操作系統同一時間能打開的文件數量是有限的,所以open()方法之后一定要調用close()方法。另外,讀寫操作可能出現IO異常的情況,所以要加try…finally,保證無論如何,都會調用到close()方法。

這樣寫萬無一失,但是實在繁瑣,一不小心還可能漏寫或者寫錯。而with語句會保證調用close(),只需一行代碼,簡直不要太優雅!所以,with語句是Python初學者必會技能。

2、什么是上下文管理器?

下面,重頭戲來了,什么是上下文管理器(context manager)?

上下文管理器是這樣一個對象:它定義程序運行時需要建立的上下文,處理程序的進入和退出,實現了上下文管理協議,即在對象中定義了 __enter__() 和 __exit__() 方法。

__enter__():進入運行時的上下文,返回運行時上下文相關的對象,with 語句中會將這個返回值綁定到目標對象。?

__exit__(exception_type, exception_value, traceback):退出運行時的上下文,定義在塊執行(或終止)之后上下文管理器應該做什么。它可以處理異常、清理現場或者處理 with 塊中語句執行完成之后需要處理的動作。

注意enter和exit的前后有兩個下劃線,Python中自帶了很多類似的方法,它們是很神秘又很強大的存在,江湖人常常稱其為“黑魔法”。例如,迭代器協議就實現了__iter__方法。

在Python的內置類型中,很多類型都是支持上下文管理協議的,例如file,thread.LockType,threading.Lock等等。

上下文管理器無法獨立使用,它們要與with相結合,with語句可以在代碼塊運行前進入一個運行時上下文(執行_enter_方法),并在代碼塊結束后退出該上下文(執行__exit__方法)。

with 語句適用于對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。

3、自定義上下文管理器

除了Python的內置類型,任何人都可以定義自己的上下文管理器。下面是一個示例:

class?OpenFile(object):
????def?__init__(self,filename,mode):
????????self.filename=filename
????????self.mode=mode
????def?__enter__(self):
????????self.f=open(self.filename,self.mode)
????????self.f.write("enter?now\n")
????????return?self.f??#作為as說明符指定的變量的值
????def?__exit__(self,type,value,tb):
????????self.f.write("exit?now")
????????self.f.close()
????????return?False???#異常會被傳遞出上下文
with?OpenFile('test.txt','w')?as?f:
????f.write('Hello?World!\n')

最終寫入文件的結果是:

enter now
Hello World!
exit now

上下文管理器必須同時提供 __enter__() 和 _exit_() 方法的定義,缺少任何一個都會導致 AttributeError。?

上下文管理器在執行過程中可能會出現異常,_exit_() 的返回值會決定異常的處理方式:返回值等于 False,那么這個異常將被重新拋出到上層;返回值等于 True,那么這個異常就被忽略,繼續執行后面的代碼。__exit()__ 有三個參數(exception_type, exception_value, traceback),即是異常的相關信息。

4、contextlib實現上下文管理器

上例中,自定義上下文管理器的寫法還是挺繁瑣的,而且只能用于類級別。為了更好地輔助上下文管理,Python 內置提供了 contextlib 模塊,進而可以很方便地實現函數級別的上下文管理器。

該模塊本質上是通過裝飾器(decorators)和生成器(generators)來實現上下文管理器,可以直接作用于函數/對象,而不用去關心 __enter__() 和 __exit()__ 方法的具體實現。

先把上面的例子改造一下,然后我們再對照著解釋:

from?contextlib?import?contextmanager

@contextmanager
def?open_file(name):
????ff?=?open(name,?'w')
????ff.write("enter?now\n")
????try:
????????yield?ff
????except?RuntimeError:
????????pass
????ff.write("exit?now")
????ff.close()

with?open_file('test.txt')?as?f:
????f.write('Hello?World!\n')

contextmanager是要使用的裝飾器,yield關鍵字將普通的函數變成了生成器。yield的返回值(ff)等于上例__enter__()的返回值,也就是as語句的值(f),而yield前后的內容,分別是_enter_() 和 _exit_() 方法里的內容。

使用contextlib,可以避免類定義、_enter_() 和 __exit()__方法,但是需要我們捕捉可能的異常(例如,yield只能返回一個值,否則會導致異常 RuntimeError),所以try…except語句不能忽略。

以上就是本文的全部內容,希望對大家的學習有所幫助。如果覺得文章不錯,動手轉發支持一下哦!


感謝您的閱讀!想了解更多有關技巧,請關注我的微信公眾號“R語言和Python學堂”,我將定期更新相關文章。同時也歡迎大家積極投稿,促進交流。

我的專欄:

  • 簡書:https://www.jianshu.com/u/981ba7d6b4a6

  • 知乎:https://www.zhihu.com/people/zoro-3-92/activities

總結

以上是生活随笔為你收集整理的pom.xml文件第一行报错_Python文件读写指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 粗大的内捧猛烈进出 | 久久精品一日日躁夜夜躁 | 成人一区二区三区在线 | 日韩精品亚洲一区 | 免费看大片a | 日韩av自拍| 欧美精品黄色 | 一区二区三区四区五区在线视频 | 五月激情婷婷网 | 亚洲17p| 亚洲素人 | 爱爱的免费视频 | 国产综合精品一区二区三区 | 亚洲精品乱码久久久久 | 日韩在线观看网站 | 精品欧美日韩 | 久久99国产精品视频 | 久久涩视频 | 呦呦色| 日本少妇xxxx软件 | 可以免费观看av | 久久久久久成人 | 一区二区三区av | 欧美做受高潮1 | 反差在线观看免费版全集完整版 | 成人小视频在线看 | 天堂网91 | 一区二区三区三区在线 | 自拍偷拍第5页 | 亚洲国产激情 | 欧美日韩一区二区三区在线播放 | 亚洲精品在线观 | 黄色在线免费观看网站 | 日本美女黄色大片 | 日韩一区二区三区精品视频 | av在线免费观看一区 | 日韩在线视频一区 | 欧美成人精品在线观看 | 欧美影视一区二区三区 | 色婷婷电影网 | 精品中文字幕一区 | 快播日韩 | 国产精品一区二区毛片 | 小仙女av| 色综合中文网 | 成人一区二区三区四区 | h片观看| 成人激情视频在线播放 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 四虎在线免费观看视频 | 亚洲人人人 | 国产精品自拍av | 在线免费av网址 | 国产精品资源网站 | 欧美一级高潮片 | 四虎精品成人免费网站 | 大陆明星乱淫(高h)小说 | 一区二区视频网 | 亚洲日日夜夜 | 日本三级欧美三级 | 琪琪五月天 | av永久免费| 青娱乐国产在线视频 | 污污网站在线免费观看 | 一区二区成人免费视频 | 一本大道伊人av久久综合 | 亚洲国产精品无码专区 | 成人性生生活性生交全黄 | 人妻精品一区 | 韩国一二三区 | 欧美一级片免费观看 | 久久久久免费 | 丝袜理论片在线观看 | 在线综合av | 美国做爰xxxⅹ性视频 | 大胸美女无遮挡 | 精品人人妻人人澡人人爽牛牛 | 亚洲国产精品久久久久 | 日本国产精品视频 | 自拍视频一区二区 | 亲子乱aⅴ一区二区三区 | 最好看的2019年中文在线观看 | 福利视频不卡 | 美女久久精品 | 国产老女人乱淫免费可以 | 国产片淫乱18一级毛片动态图 | 精品国产视频一区二区 | 国产免费激情视频 | 国产成人精品一区 | 少妇高潮惨叫久久久久 | 老子影院午夜伦不卡大全 | 好男人www在线视频 我们的2018在线观看免费高清 | 亚洲区在线播放 | 青青久在线视频 | 亚洲精品中文字幕在线播放 | 成年人在线播放视频 | 午夜视频福利在线观看 | 午夜伦理视频 | 亚洲国产无码久久 |