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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章