1. 程式人生 > >Python進階(二十五)-Python讀寫檔案

Python進階(二十五)-Python讀寫檔案

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow

也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp

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
  • 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

這裡寫圖片描述
這裡寫圖片描述

給我偶像的人工智慧教程打call!http://blog.csdn.net/jiangjunshow