1. 程式人生 > >PYthon--(檔案I/O)

PYthon--(檔案I/O)

一、

1.絕對路徑的讀取

通過編碼格式來讀取檔案中的中文

 
foo=open(R'D:\python專案\記事本.txt','r+',encoding='utf-8')#編碼格式必須與檔案的編碼格式一致 R:去掉特殊符
text=foo.read()
print(text)

2.檔案讀取得其他方法:

readline():讀取一行,直到一行結束

foo=open(R'D:\python專案\記事本.txt','r+',encoding='utf-8')
#迴圈讀取 以行為單位 讀取全部內容
text=foo.readline()
while len(text)!=0:
    print(text)
    text = foo.readline()

執行命令得

 
1.python---java

2.python---java

3.python---java

readlines():多行讀取

 
foo=open(R'D:\python專案\記事本.txt','r+',encoding='utf-8')
fjava=open('D:\python專案\java記事本.txt','w+',encoding='utf-8')
text=foo.readlines()
print(text)
for li in text:
    fjava.write(li.replace('python','java'))#將讀取到的python換為java 並且寫入fjava檔案中
    print(li)
print(type(text))   #<class 'list'>
print(len(text))  # 以行為單位:  輸出為 3
foo.close()
fjava.close()
print('複製並替換完成')

執行命令得

 
['\ufeff\ufeff1.python---java\n', '2.python---java\n', '3.python---java']
1.python---java

2.python---java

3.python---java
<class 'list'>
3
複製並替換完成

二、類似爬蟲

模擬瀏覽器獲得原始碼爬所需要的東西

原始碼的獲取

 
from urllib import request

#請求(request)開啟一個url
response=request.urlopen('https://www.baidu.com/')
#在本地建立一個檔案
xm=open('baidu.txt','w',encoding='utf-8')
#讀取網頁中的原始碼 並寫入新建立的檔案中
txt=response.read()
xm.write(str(txt.decode()))
xm.close()

執行命令得

 
#baidu.txt檔案中
<html>

<head>

	<script>

		location.replace(location.href.replace("https://","http://"));

	</script>

</head>

<body>

	<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>

</body>

</html>

三、XML(EXtensible Markup Language),可擴充套件標記語言

1.特點:XML與作業系統  程式語言的開發平臺無關

實現不同系統之間的資料交換

2.作用:資料交換

配置應用程式和網站

3.XML文件內容由一系列標籤元素組成

<元素名 屬性名='屬性值'>元素內容</元素名>

屬性值用雙引號包裹

一個元素可以有多個屬性

屬性值中不能直接包含<、"、&(不建議:  ' >)

4.標籤編寫注意事項

所有XML元素都必須有結束標籤

XML標籤對大小寫敏感

XML必須正確巢狀

同級標籤以縮排對齊

元素名稱可以包含字母  數字或其他的字元

元素名稱不能以數字或者標點符號開始

元素名稱中不能含空格

5.Python中提供的XML解析方式:

方法特點
SAXSAX解析通過流模式在解析XML的過程中觸發對應的事件(start_element、char_data、end_element)並呼叫使用者定義的回撥函式來處理XML檔案。
DOM將XML資料在記憶體中解析成一個樹,通過對樹的操作來操作XML,佔用記憶體大,解析速度較慢,優點是可以任意遍歷樹的節點。
ElementTree類似一個輕量級的DOM,也是本篇文章主要介紹的。

6.準備一份XML格式的檔案(檔名為lianxi.xml)

 
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

7.XML格式介紹

<tag attrib = > text </tag> tail
例:<APP_KEY channel = 'CSDN'> hello123456789 </APP_KEY>

  • tag,即標籤,用於標識該元素表示哪種資料,即APP_KEY
  • attrib,即屬性,用Dictionary形式儲存,即{'channel' = 'CSDN'}
  • text,文字字串,可以用來儲存一些資料,即hello123456789
  • tail,尾字串,並不是必須的,例子中沒有包含。

7.ElementTree解析XML檔案的過程:

匯入ElementTree,import xml.etree.ElementTree as ET

解析XML檔案找到根節點

直接捷信XML檔案並獲得根節點:tree=ET.parse('country_datat.xml') root=tree.getroot()

解析字串: root=ET.fromstring(country_datat_as_string)

遍歷根節點可以獲得子節點,然後就可以根據要求拿到需要的欄位了

原始碼演示:

 
import xml.etree.ElementTree as ET

#1.先載入文件到記憶體裡 形成一個倒樁的樹結構
tree=ET.parse('lianxi.xml')
#2.獲取根節點
root=tree.getroot()
print('root-tag:',root.tag,'root-attrib:',root.attrib,'root-text:',root.text)
for child in root:
    print('child-tag:',child.tag,'child-attrib:',child.attrib,'child-text:',child.text)
    for sub in child:
        print('sub-tag是:', sub.tag, ',sub.attrib:', sub.attrib, ',sub.text:', sub.text)

執行命令得

 
root-tag: data root-attrib: {} root-text: 
    
child-tag: country child-attrib: {'name': 'Liechtenstein'} child-text: 
        
sub-tag是: rank ,sub.attrib: {} ,sub.text: 1
sub-tag是: year ,sub.attrib: {} ,sub.text: 2008
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 141100
sub-tag是: neighbor ,sub.attrib: {'name': 'Austria', 'direction': 'E'} ,sub.text: None
sub-tag是: neighbor ,sub.attrib: {'name': 'Switzerland', 'direction': 'W'} ,sub.text: None
child-tag: country child-attrib: {'name': 'Singapore'} child-text: 
        
sub-tag是: rank ,sub.attrib: {} ,sub.text: 4
sub-tag是: year ,sub.attrib: {} ,sub.text: 2011
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 59900
sub-tag是: neighbor ,sub.attrib: {'name': 'Malaysia', 'direction': 'N'} ,sub.text: None
child-tag: country child-attrib: {'name': 'Panama'} child-text: 
        
sub-tag是: rank ,sub.attrib: {} ,sub.text: 68
sub-tag是: year ,sub.attrib: {} ,sub.text: 2011
sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 13600
sub-tag是: neighbor ,sub.attrib: {'name': 'Costa Rica', 'direction': 'W'} ,sub.text: None
sub-tag是: neighbor ,sub.attrib: {'name': 'Colombia', 'direction': 'E'} ,sub.text: None

8.查詢節點

當XML檔案較大或者其中的子節點tag非常多的時候,一個一個獲取是比較麻煩的而且有很多我們不要的,這樣就可以通過find('nodeName')或者findall('nodeName')方法來查詢指定的節點

find('nodeName'):表示在該節點下,查詢其中第一個tag為nodeName的節點。
findall('nodeName'):表示在該節點下,查詢其中所有tag為nodeName的節點

 
import xml.etree.ElementTree as ET


tree=ET.parse('lianxi.xml')
root=tree.getroot()
animNode=root.find('country')#查詢root節點下第一個tag為country得節點
print(animNode.tag,animNode.attrib,animNode.text)

執行命令得

 
country {'name': 'Liechtenstein'} 

9.刪除指定的節點以及儲存

在合併Manifest檔案的時候,可能有一些重複的許可權,那麼怎麼刪除掉呢,刪除指定節點可以通過remove(node)方法,移除指定的節點。

刪除屬性name為Liechtenstein節點

 
import xml.etree.ElementTree as ET

tree=ET.parse('lianxi.xml')
root=tree.getroot()
animNode=root.find('country')#查詢root節點下第一個tag為country得節點
print(animNode.tag,animNode.attrib,animNode.text)
if animNode.attrib['name'] =='Liechtenstein':
    root.remove(animNode)
tree.write('lianxi.xml')#儲存修改後的XML檔案

執行命令得

 
<data>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>

三、XML解析器 體系結構和API

Python標準庫提供了一組極少使用但有用的介面來處理XML.兩個基本和最廣泛使用在XML資料的API是SAX 和XDOM介面

簡單的XML(SAX) 在這裡,註冊感興趣的時間回撥,然後讓解析器繼續執行文件.當文件較大或存在記憶體限制時,此功能非常有用,它會從檔案讀取檔案時解析檔案,並且整個檔案不會儲存在記憶體中.

文件物件模型(DOM)API這是一個全球資訊網聯盟的推薦,它將整個檔案讀入儲存起並以分層(基於樹)得形式儲存,以表示XML文件的所有功能

當處理大檔案時,SAX顯然無法與DOM一樣快地處理資訊。 另一方面,使用DOM專門可以真正地佔用資源,特別是如果要加許多檔案使用的時候。

SAX是隻讀的,而DOM允許更改XML檔案。由於這兩種不同的API相輔相成,在大型專案中一般根據需要使用它們。

對於我們所有的XML程式碼示例,使用一個簡單的XML檔案:movies.xml作為輸入 -

 
<?xml version="1.0" encoding="utf-8" ?>
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2013</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title = "Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

SAX是事件驅動的XML解析的標準介面。 使用SAX解析XML通常需要通過子類化xml.sax.ContentHandler來建立自己的ContentHandler
ContentHandler處理XML樣式/風格的特定標籤和屬性。 ContentHandler物件提供了處理各種解析事件的方法。它擁有的解析器在解析XML檔案時呼叫ContentHandler方法。
在XML檔案的開頭和結尾分別呼叫:startDocumentendDocument方法。 characters(text)方法通過引數text傳遞XML檔案的字元資料。

ContentHandler在每個元素的開頭和結尾被呼叫。如果解析器不在名稱空間模式下,則呼叫startElement(tag,attributes)endElement(tag)方法; 否則,呼叫相應的方法startElementNSendElementNS方法。 這裡,tag是元素標籤,屬性是Attributes物件。

以下是繼續前面瞭解的其他重要方法 -

parse()方法

以下方法建立一個SAX解析器並使用它來解析文件

xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Python

以下是引數的詳細資訊 -

  • xmlfile - 這是要讀取的XML檔案的名稱。
  • contenthandler - 這必須是ContentHandler物件。
  • errorhandler - 如果指定,errorhandler必須是SAX ErrorHandler

 

import xml.sax
class MovieHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.CurrentData = ""#當前讀取的物件節點屬性
        self.type = ""
        self.format = ""
        self.year = ""
        self.rating = ""
        self.stars = ""
        self.description = ""

    def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print ("*****Movie*****")
         title = attributes["title"]
         print ("Title:", title)

    # Call when an elements ends
    def endElement(self, tag):
      if self.CurrentData == "type":
         print ("Type:", self.type)
      elif self.CurrentData == "format":
         print ("Format:", self.format)
      elif self.CurrentData == "year":
         print ("Year:", self.year)
      elif self.CurrentData == "rating":
         print ("Rating:", self.rating)
      elif self.CurrentData == "stars":
         print ("Stars:", self.stars)
      elif self.CurrentData == "description":
         print ("Description:", self.description)
      self.CurrentData = ""

    # Call when a character is read
    def characters(self, content):#傳遞
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content

if ( __name__ == "__main__"):
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces 工作目錄
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   parser.parse("movie.xml")

執行命令

 
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2013
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

相關推薦

python檔案I/O

常用的有:讀取鍵盤輸入,開啟關閉檔案 一、讀取鍵盤輸入(這裡只說2.X版本的用法吧) raw_input() input() 先說raw_input() ,將輸入作為字串看待,返回字串型別,不顯示結尾的符號 input(),可接收一個python表示式返回結果,也可以顯示鍵盤輸入的字元 二、開啟關

python-檔案I/O與異常處理

open函式 Python內建的open()函式開啟一個檔案,建立一個file物件,相關的輔助方法才可以呼叫它進行讀寫。語法為: file object = open(file_name [, access_mode][, buffering]) 各個引數的細節如下: 1、file_name

PYthon--(檔案I/O)

一、1.絕對路徑的讀取通過編碼格式來讀取檔案中的中文 foo=open(R'D:\python專案\記事本.txt','r+',encoding='utf-8')#編碼格式必須與檔案的編碼格式一致 R:去掉特殊符 text=foo.read() print(text)2.檔

Python入門(十)檔案I/O

Python 檔案I/O 本章只講述所有基本的的I/O函式,更多函式請參考Python標準文件。 列印到螢幕 最簡單的輸出方法是用print語句,你可以給它傳遞零個或多個用逗號隔開的表示式。此函式把你傳遞的表示式轉換成一個字串表示式,並將結果寫到標準輸出如下: #!/usr/

Python 15 I/O編程

obj 最簡 font \n 童鞋 系統 占用 rip 成功 讀寫文件是最常見的IO操作。Python內置了讀寫文件的函數,用法和C是兼容的。 讀寫文件前,我們先必須了解一下,在磁盤上讀寫文件的功能都是由操作系統提供的,現代操作系統不允許普通的程序直接操作磁盤, 所以,讀寫

檔案I/O相關函式

open()和openat()函式: #include <fcntl.h> // 成功返回檔案描述符,出錯返回-1 int open(const char *path, int oflag, ... /* mode_t mode */); int openat(int fd, const

C標準庫I/O和Linux檔案I/O

I/O分類:     有兩種I/O,一是檔案I/O,而我們c語言的封裝叫標準I/O,他們有什麼區別那?顯然標準I/O是基於檔案I/O的,標準IO呼叫了檔案IO,也優化了檔案IO,例如引入快取機制。     所以C標準

[Unix環境高階程式設計] 檔案I/O

1.引言 UNIX系統中的大多數檔案I/O只需要用到5個函式:open、read、write、lseek以及close,這裡所涉及到的函式經常被稱為不帶緩衝的I/O1。只要涉及在多個程序之間共享資源,原子操作的概念就變得非常重要,我們將通過I/O和open函式的引數來討論此概念,dup、

第二十章:非同步和檔案I/O.(六)

非同步儲存程式設定正如您在第6章“按鈕單擊”中發現的那樣,您可以將程式設定儲存在Application類維護的名為Properties的字典中。您在“屬性”字典中放置的任何內容都將在程式進入睡眠狀態時儲存,並在程式恢復或重新啟動時恢復。有時在更改時儲存此字典中的設定很方便,有時候等到在App類中呼叫OnSle

sysbench的CPU,檔案I/O,OLTP三種基準測試

sysbench是一款多執行緒系統壓測工具,可以執行多種型別的基準測試,它不僅設計用來測試資料的效能,也可以測試執行資料庫的服武器的效能 一,CPU基準測試 最典型的子系統測試 該測試使用64位整數,測試計算素數直到某個最大值所需要的時間 GNU/Linux伺服器: 檢視CPU配

第二十章:非同步和檔案I/O.(九)

跨平臺檔案I / O的第一個鏡頭在一般情況下,您將使用DependencyService為您的Xamarin.Forms應用程式提供對檔案I / O功能的訪問。從之前對DependencyService的探索中可以瞭解到,您可以在Portable Class Library專案中的介面中定義所需的函式,而實現

C語言-讀寫檔案I/O

C語言讀寫檔案的步驟一般是: 建立或開啟檔案 > 讀或寫檔案 > 關閉檔案 當然讀或寫的過程中還可以通過操作當前檔案偏移量來控制讀寫位置。 下面分別介紹這些函式。 標頭檔案: #include <fcntl.h> //此標頭檔案定義了以下oflag O_RDO

用C++實現簡單的檔案I/O操作

檔案 I/O 在C++中比烤蛋糕簡單多了。 在這篇文章裡,我會詳細解釋ASCII和二進位制檔案的輸入輸出的每個細節,值得注意的是,所有這些都是用C++完成的。 一、ASCII 輸出 為了使用下面的方法, 你必須包含標頭檔案<fstream.h>(譯者注:在標準C++中,已

檔案I/O讀寫操作

在上一篇文章中,我簡單講述瞭如何進行開啟檔案操作。而在這一篇文章中,我將會對開啟的檔案進行操作。 在進行檔案讀寫操作之前,需要了解一個緩衝區(buff)的概念,緩衝區是在記憶體中預留指定大小的儲存空間用來對I/O的資料做臨時儲存,這部分預留的記憶體空間叫緩衝區

系統程式設計——檔案I/O操作相關API

檔案I/O操作相關API 1.開啟一個檔案open(),既能開啟已存在的檔案,也能建立開啟一個新檔案 函式原型: #include <sys/stat.h> #include <fcntl.h> int open(const char *pathna

風火程式設計--python檔案管理o模組的相關內容

os模組的常用屬性和方法 os屬性 os.linesep # 換行符 os.sep # 路徑名分隔符 os.pathsep # 路徑分隔符 os.curdir # 當前路徑 os.pardir

C++---檔案I/O,C++裡對檔案的操作--例子--檔案的複製

依然還是從一個程式說起:將一個檔案複製到另一個檔案 C語言來實現: #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ FILE *in,*out; int ch;//gets

第二十章:非同步和檔案I/O.(十二)

雖然每個方法都被定義為返回Task或Task 物件,但是方法的主體沒有任何對Task或Task 的引用。相反,返回Task物件的方法只是執行一些工作,然後使用隱式return語句結束該方法。 ExistsAsync方法定義為返回Task 但返回true或false。 (StorageFolder類中沒有Exi

PythonCookBook 筆記 chapter-05-檔案I/O

open函式及引數點選開啟連結 1, 開啟文字檔案的兩種模式 filename = 'file.py' # 對文字檔案的讀寫rt/wt, 對二進位制資料的讀寫rb/wb # 離開with語句塊後,檔案自動關閉 with open(filename, 'rt') as fObj:  

02_檔案I/O:lseek

檔案I/O:lseek 1、lseek lseek()API簡介: 對於每個開啟的檔案,系統核心會記錄其檔案偏移量,有時也將檔案偏移量稱為讀寫偏移量或指標。檔案偏移量是指執行下一個 read()或 write()操作的檔案起始位置,會以相對於檔案頭部起始點的檔