Python進階(二十五)-Python讀寫文件

      網友投稿 854 2022-05-29

      #Python進階(二十五)-Python讀寫文件

      ##打開文件

      使用open打開文件后一定要記得調用文件對象的close()方法。比如可以用try/finally語句來確保最后能關閉文件。

      file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( )

      1

      2

      3

      4

      5

      注:不能把open語句放在try塊里,因為當打開文件出現異常時,文件對象file_object無法執行close()方法。

      ##讀文件

      #讀文本文件 input = open('data', 'r') #第二個參數默認為r input = open('data') #讀二進制文件 input = open('data', 'rb') #讀取所有內容 file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) #讀固定字節 file_object = open('abinfile', 'rb') try: while True: chunk = file_object.read(100) if not chunk: break do_something_with(chunk) finally: file_object.close( ) #讀每行 list_of_all_the_lines = file_object.readlines( ) #如果文件是文本文件,還可以直接遍歷文件對象獲取每行: for line in file_object: process line

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      ##寫文件

      #寫文本文件 output = open('data', 'w') #寫二進制文件 output = open('data', 'wb') #追加寫文件 output = open('data', 'w+') #寫數據 file_object = open('thefile.txt', 'w') file_object.write(all_the_text) file_object.close( ) #寫入多行 file_object.writelines(list_of_text_strings)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      注意,調用writelines寫入多行在性能上會比使用write一次性寫入要高。

      在處理日志文件的時候,常常會遇到這樣的情況:日志文件巨大,不可能一次性把整個文件讀入到內存中進行處理,例如需要在一臺物理內存為 2GB 的機器上處理一個 2GB 的日志文件,我們可能希望每次只處理其中200MB的內容。

      在Python中,內置的File對象直接提供了一個readlines(sizehint) 函數來完成這樣的事情。以下面的代碼為例:

      file = open('test.log', 'r') sizehint = 209715200 # 200M position = 0lines = file.readlines(sizehint) while not file.tell() - position < 0: position = file.tell() lines = file.readlines(sizehint)

      1

      2

      3

      4

      5

      6

      每次調用 readlines(sizehint) 函數,會返回大約200MB的數據,而且所返回的必然都是完整的行數據,大多數情況下,返回的數據的字節數會稍微比 sizehint 指定的值大一點(除最后一次調用 readlines(sizehint) 函數的時候)。通常情況下,Python 會自動將用戶指定的 sizehint 的值調整成內部緩存大小的整數倍。

      file在python是一個特殊的類型,它用于在python程序中對外部的文件進行操作。在python中一切都是對象,file也不例外,file有file的方法和屬性。下面先來看如何創建一個file對象:

      file(name[, mode[, buffering]])

      1

      file()函數用于創建一個file對象,它有一個別名叫open(),可能更形象一些,它們是內置函數。來看看它的參數。它參數都是以字符串的形式傳遞的。

      name是文件的名字。

      mode是打開的模式,可選的值為rwaU,分別代表讀(默認)寫添加支持各種換行符的模式。用w或a模式打開文件的話,如果文件不存在,那么就自動創建。此外,用w模式打開一個已經存在的文件時,原有文件的內容會被清空,因為一開始文件的操作的標記是在文件的開頭的,這時候進行寫操作,無疑會把原有的內容給抹掉。由于歷史的原因,換行符在不同的系統中有不同模式,比如在unix中是一個\n,而在windows中是‘\r\n’,用U模式打開文件,就是支持所有的換行模式,也就說‘\r’ ‘\n’ '\r\n’都可表示換行,會有一個tuple用來存貯這個文件中用到過的換行符。不過,雖說換行有多種模式,讀到python中統一用\n代替。在模式字符的后面,還可以加上+ b t這兩種標識,分別表示可以對文件同時進行讀寫操作和用二進制模式、文本模式(默認)打開文件。

      buffering如果為0表示不進行緩沖;如果為1表示進行“行緩沖“;如果是一個大于1的數表示緩沖區的大小,應該是以字節為單位的。

      file對象有自己的屬性和方法。先來看看file的屬性。

      closed #標記文件是否已經關閉,由close()改寫

      encoding #文件編碼

      mode #打開模式

      name #文件名

      newlines #文件中用到的換行模式,是一個tuple

      softspace #boolean型,一般為0,據說用于print

      file的讀寫方法:

      F.read([size]) #size為讀取的長度,以byte為單位 F.readline([size])

      1

      2

      #讀一行,如果定義了size,有可能返回的只是一行的一部分 F.readlines([size]) #把文件每一行作為一個list的一個成員,并返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分。 F.write(str) #把str寫到文件中,write()并不會在str后加上一個換行符 F.writelines(seq) #把seq的內容全部寫到文件中。這個函數也只是忠實地寫入,不會在每行后面加上任何東西。 file的其他方法: F.close() #關閉文件。python會在一個文件不用后自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個文件在關閉后還對其進行操作會產生ValueError。 F.flush() #把緩沖區的內容寫入硬盤 F.fileno() #返回一個長整型的”文件標簽“ F.isatty() #文件是否是一個終端設備文件(unix系統中的) F.tell() #返回文件操作標記的當前位置,以文件的開頭為原點 F.next() #返回下一行,并將文件操作標記位移到下一行。把一個file用于for ... in file這樣的語句時,就是調用next()函數來實現遍歷的。 F.seek(offset[,whence]) #將文件打操作標記移到offset的位置。這個offset一般是相對于文件的開頭來計算的,一般為正數。但如果提供了whence參數就不一定了,whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。需要注意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾。 F.truncate([size]) #把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      ##代碼演示

      #! /usr/bin/python import os,sys try: fsock = open("D:/SVNtest/test.py", "r") except IOError: print "The file don't exist, Please double check!" exit() print 'The file mode is ',fsock.mode print 'The file name is ',fsock.name P = fsock.tell() print 'the postion is %d' %(P) fsock.close() #Read file fsock = open("D:/SVNtest/test.py", "r") AllLines = fsock.readlines() #Method 1 for EachLine in fsock: print EachLine #Method 2 print 'Star'+'='*30 for EachLine in AllLines: print EachLine print 'End'+'='*30 fsock.close() #write this file fsock = open("D:/SVNtest/test.py", "a") fsock.write(""" #Line 1 Just for test purpose #Line 2 Just for test purpose #Line 3 Just for test purpose""") fsock.close() #check the file status S1 = fsock.closed if True == S1: print 'the file is closed' else: print 'The file donot close' 附 Python讀取TXT文檔 #直接在訪問文檔時指定編碼方式 myText = open(r"C:/Users/SHQ/Desktop/maya.txt", "r", encoding='UTF-8') try: print(myText.read()) finally: myText.close()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      Python進階(二十五)-Python讀寫文件

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      ##附 Python讀取PDF文檔

      #!/usr/bin/env python # encoding: utf-8 """ @author: Sunny @software: IntelliJ IDEA @file: prase_pdf.py @time: 2017/4/4 """ import sys import importlib importlib.reload(sys) from pdfminer.pdfparser import PDFParser,PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal,LAParams from pdfminer.pdfinterp import PDFTextExtractionNotAllowed ''' 解析pdf 文本,保存到txt文件中 ''' path = r'C:/Users/SHQ/Desktop/當前工作/基于Petri網的APP用戶行為分析及應用(最終版-定稿-打印).pdf' def parse(): #以二進制讀模式打開 fp = open(path, 'rb') #用文件對象來創建一個pdf文檔分析器 praser = PDFParser(fp) # 創建一個PDF文檔 doc = PDFDocument() # 連接分析器與文檔對象 praser.set_document(doc) doc.set_parser(praser) # 提供初始化密碼 # 如果沒有密碼 就創建一個空的字符串 doc.initialize() # 檢測文檔是否提供txt轉換,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed else: # 創建PDf 資源管理器 來管理共享資源 rsrcmgr = PDFResourceManager() # 創建一個PDF參數分析器 laparams = LAParams() # 創建一個PDF資源聚合器 用于整合資源管理器和參數分析器 device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 創建一個PDF解釋器對象 interpreter = PDFPageInterpreter(rsrcmgr, device) # 循環遍歷列表,每次處理一個page的內容 for page in doc.get_pages(): # doc.get_pages() 獲取page列表 interpreter.process_page(page) # 接受該頁面的LTPage對象 layout = device.get_result() # 這里layout是一個LTPage對象 里面存放著這個page解析出的各種對象, # 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等想要獲取文本就獲得對象的text屬性, for x in layout: if (isinstance(x, LTTextBoxHorizontal)) and hasattr(x, "get_text"): with open(r'C:/Users/SHQ/Desktop/當前工作/基于Petri網的APP用戶行為分析及應用(最終版-定稿-打印).txt', 'a') as f: results = x.get_text() print(results) f.write(results + '\n') if __name__ == '__main__': parse()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/46cc348062c27bf57424afe162b04ab4.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/f9c024e20306fb0e4e3e84a15aab3217.png)

      Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:為什么自制腳本語言是編程語言的最高境界?
      下一篇:如何優雅拒絕產品經理的不合理需求
      相關文章
      色婷五月综激情亚洲综合 | 亚洲精品无码久久久久秋霞| 久久国产亚洲观看| 国产∨亚洲V天堂无码久久久| 亚洲最大av无码网址| 亚洲第一区在线观看| 国产亚洲视频在线观看网址| 亚洲AV无码片一区二区三区| 亚洲av日韩专区在线观看| 亚洲av无码一区二区三区四区| 亚洲AV综合色区无码一二三区| 亚洲第一成年免费网站| 亚洲a∨国产av综合av下载| 亚洲AV成人一区二区三区观看| 久久精品亚洲日本波多野结衣 | 国产精品久久亚洲不卡动漫| 亚洲人6666成人观看| 亚洲伊人久久大香线蕉结合| 国产亚洲精品VA片在线播放| 亚洲精品无码久久久久APP| 一本天堂ⅴ无码亚洲道久久| 亚洲另类无码专区首页| 亚洲a∨无码精品色午夜| 亚洲第一黄片大全| 久久影视综合亚洲| 亚洲不卡av不卡一区二区| 亚洲天堂男人天堂| 亚洲天堂一区在线| 亚洲欧美第一成人网站7777| 最新亚洲人成无码网站| 亚洲欧洲日本在线| 亚洲国产成人精品无码区在线观看 | 2020亚洲男人天堂精品| 中文字幕乱码亚洲无线三区 | 亚洲av永久中文无码精品综合 | 亚洲成人影院在线观看| 亚洲精品国产字幕久久不卡| 亚洲精品国产字幕久久不卡| 亚洲高清中文字幕综合网| 久久精品国产99国产精品亚洲| 亚洲国产精品无码观看久久|