<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          比Open更適合讀取文件的Python模塊

          共 17944字,需瀏覽 36分鐘

           ·

          2021-08-24 12:30

          有時(shí)我們需要把數(shù)據(jù)永久存儲(chǔ)起來,隨時(shí)使用隨時(shí)讀取。例如,我們通過程序建立的列表、字典等數(shù)據(jù),當(dāng)程序結(jié)束時(shí),需要把這些數(shù)據(jù)存儲(chǔ)到文件中,當(dāng)程序再次啟動(dòng)時(shí),可以把這些數(shù)據(jù)讀入到程序中,避免這些數(shù)據(jù)的重新錄入。

          Python語言中,負(fù)責(zé)文件操作的稱為文件對(duì)象,文件對(duì)象不僅可以訪問存儲(chǔ)在磁盤中的文件,也可以訪問網(wǎng)絡(luò)文件。文件對(duì)象通過open函數(shù)得到,獲取文件對(duì)象后,就可以使用文件對(duì)象提供的方法來讀寫文件。

          open函數(shù)在處理某些問題是并不是很理想,有沒有其他比open函數(shù)更加適合讀取某些特定文件呢?下面我們就一起來看看!

          回顧open函數(shù)

          對(duì)文件操作使用最頻繁對(duì)函數(shù),open()打開一個(gè)文件對(duì)象,使用Python內(nèi)置的open()函數(shù),傳入文件名和模式。

          file_object = open(name [, mode][, buffering])

          name: 要讀取的文件名稱。

          mode: 打開文件的模式,選填。r, r+, w, w+, a, a+使用最多。

          buffering: 文件所需的緩沖區(qū)大小, 選填。0表示無緩沖, 1表示線路緩沖。有四種打開文件的不同方法(模式)

          • "r" - 讀取 - 默認(rèn)值。打開文件進(jìn)行讀取,如果文件不存在則報(bào)錯(cuò)。
          • "a" - 追加 - 打開供追加的文件,如果不存在則創(chuàng)建該文件。
          • "w" - 寫入 - 打開文件進(jìn)行寫入,如果文件不存在則創(chuàng)建該文件。
          • "x" - 創(chuàng)建 - 創(chuàng)建指定的文件,如果文件存在則返回錯(cuò)誤。

          此外,可以指定文件是應(yīng)該作為二進(jìn)制還是文本模式進(jìn)行處理。

          • "t" - 文本 - 默認(rèn)值。文本模式。
          • "b" - 二進(jìn)制 - 二進(jìn)制模式(例如圖像)。

          使用時(shí)常通過with open()方法讀寫文件。

          with open("文件名.txt""r"as fin: # fin為 別名(文件句柄對(duì)象)
            file =  fin.read() # 會(huì)一次性讀取文件的全部?jī)?nèi)容
              file_line = fin.readline() # 可以每次讀取一行內(nèi)容
              file_lines = fin.readlines() # 一次讀取所有內(nèi)容并按行返回list

          pathlib


          以前在Python中操作文件路徑,更多的時(shí)候是使用os模塊。Python3的系統(tǒng)標(biāo)準(zhǔn)庫pathlib模塊的Path對(duì)路徑的操作會(huì)更簡(jiǎn)單。

          pathlib的一些基本操作,如文件名操作、路徑操作、文件操作等等并不在本文討論范圍。本此介紹使用率非常高的文件操作,其文件讀寫方法。

          Path.open

          pathlib里如果要打開一個(gè)文件十分的簡(jiǎn)單。

          Path.open(mode='r'
                    buffering=-1
                    encoding=None
                    errors=None
                    newline=None)

          打開路徑指向的文件,就像內(nèi)置的open()函數(shù)所做的一樣。

          from pathlib2 import Path
          example_path = Path('./info.csv')
          with example_path.open() as f:
             print(f.readline())
             print(f.read())

          結(jié)果

          "編號(hào)","性別","年齡","成績(jī)"

          961067,"男",23,97
          969157,"男",38,98
          969237,"男",27,120
          970394,"男",27,118

          Path讀與寫

          對(duì)于簡(jiǎn)單的文件讀寫,在pathlib模塊中有幾個(gè)簡(jiǎn)便的方法:

          Path.read_text(): 以字符串形式返回路徑指向的文件的解碼后文本內(nèi)容。

          Path.read_bytes(): 以二進(jìn)制/字節(jié)模式打開路徑并以字節(jié)串的形式返回內(nèi)容。

          Path.write_text(): 打開路徑并向其寫入字符串?dāng)?shù)據(jù)。

          Path.write_bytes(): 以二進(jìn)制/字節(jié)模式打開路徑并向其寫入數(shù)據(jù)。

          >>> p = Path('my_binary_file')
          >>> p.write_bytes(b'Binary file contents')
          20
          >>> p.read_bytes()
          b'Binary file contents'

          >>> p = Path('my_text_file')
          >>> p.write_text('Text file contents')
          18
          >>> p.read_text()
          'Text file contents'

          更多詳情可參見pathlib模塊[1]

          fileinput


          如果你只想讀取一個(gè)文件,使用open()。如果需要實(shí)現(xiàn)文件列表的批量循環(huán)操作,不妨使用本模塊。

          fileinput.input

          inputfileinput模塊的初始接口,其使用也是較簡(jiǎn)單。

          fileinput.input(files=None
                          inplace=False
                          backup=''
                          *, 
                          mode='r'
                          openhook=None)

          files 需要讀取的文件對(duì)象,可迭代對(duì)象。

          inplace 標(biāo)準(zhǔn)輸出重定向替換,表示是否將標(biāo)準(zhǔn)輸出的結(jié)果寫回文件,默認(rèn)不取代。

          backup 讀取時(shí)同時(shí)備份文件,可以指定備份的后綴名,比如 backup='.bak'。

          mode  文件讀取模式,fileinput 有且僅有這兩種讀取模式rrb

          • 默認(rèn)使用 mode='r'
          • 如果文件是二進(jìn)制的,可以使用mode='rb' 模式。

          openhook 支持用戶傳入自定義的對(duì)象讀取方法。fileinput 內(nèi)置了兩個(gè)勾子函數(shù):

          • fileinput.hook_encoded(encoding, errors=None)
            使用 gzipbz2模塊透明地打開 gzip 和 bzip2 壓縮的文件
          • fileinput.hook_compressed(filename, mode)
            使用給定的 encoding 和 errors 來讀取文件。

          從標(biāo)準(zhǔn)輸入中讀取

          input()不傳任何參數(shù)時(shí),fileinput 默認(rèn)會(huì)以 stdin 作為輸入源。

          運(yùn)行stdinput.py后,在編譯器中輸入內(nèi)容,程序會(huì)自動(dòng)讀取并再打印一次。

          # stdinput.py
          import fileinput
          for line in fileinput.input():
              print(line)
          >>> python stdinput.py 
          >>> hello
          hello
          >>> python
          python

          從指定文件中讀取

          讀取批量文件

          import fileinput
          with fileinput.input(files=('info1.csv''info2.csv')) as file:
              for line in file:
                  print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end=''

          輸出

          info1.csv 第1行: |編號(hào)| |性別| |年齡| |成績(jī)|  
          info1.csv 第2行: 961067 |男| 23 97  
          info1.csv 第3行: 969157 |男| 38 98  
          info2.csv 第4行: "編號(hào)","性別","年齡","成績(jī)"  
          info2.csv 第5行: 969237,"男",27,120  
          info2.csv 第6行: 970394,"男",27,118  

          由于 info.txtinfo.txt 的內(nèi)容被整合成一個(gè)文件對(duì)象 file ,因此 fileinput.lineno() 只有在讀取一個(gè)文件時(shí),才是原文件中真實(shí)的行號(hào)。如果想要在讀取多個(gè)文件的時(shí)候,也能讀取原文件的真實(shí)行號(hào),可以使用 fileinput.filelineno() 方法。

          以上幾個(gè)常用對(duì)方法解釋如下。

          fileinput.filename()

          返回當(dāng)前被讀取的文件名。在第一行被讀取之前,返回 None。

          fileinput.lineno()

          返回已被讀取的累計(jì)行號(hào)。在第一行被讀取之前,返回 0。在最后一個(gè)文件的最后一行被讀取之后,返回該行的行號(hào)。

          fileinput.filelineno()

          返回當(dāng)前文件中的行號(hào)。在第一行被讀取之前,返回 0。在最后一個(gè)文件的最后一行被讀取之后,返回此文件中該行的行號(hào)。

          讀取單個(gè)文件

          與批量讀取文件一樣,只需要在參數(shù)files中傳人一個(gè)文件即可。

          import fileinput
          with fileinput.input(files=('info2.csv')) as file:
              for line in file:
                  print(f'{fileinput.filename()} 第{fileinput.lineno()}行: {line}', end=''

          輸出

          info2.csv 第1行: "編號(hào)","性別","年齡","成績(jī)"
          info2.csv 第2行: 969237,"男",27,120
          info2.csv 第3行: 970394,"男",27,118

          與glob配合批量讀取

          glob簡(jiǎn)介

          glob是python自帶的一個(gè)操作文件的相關(guān)模塊,可以對(duì)文件夾下所有文件進(jìn)行遍歷,并將符合匹配模式的文件名保存為一個(gè)list列表。

          glob.glob(pathname, *, recursive=False)

          返回匹配 pathname 的可能為空的路徑名列表,其中的元素必須為包含路徑信息的字符串。

          pathname 可以是絕對(duì)路徑 (如 /usr/src/Tools/sub/1.gif) 或相對(duì)路徑 (如 ../../Tools/*/*.gif),并且可包含 shell 風(fēng)格的通配符。

          實(shí)例

          一個(gè)包含以下內(nèi)容的目錄:文件 1.gif, 2.txt, card.gif 以及一個(gè)子目錄 sub 其中只包含一個(gè)文件 3.txtglob()將產(chǎn)生如下結(jié)果。請(qǐng)注意路徑的任何開頭部分都將被保留。

          >>> import glob
          >>> glob.glob('./[0-9].*')
          ['./1.gif', './2.txt']
          >>> glob.glob('*.gif')
          ['1.gif', 'card.gif']
          >>> glob.glob('?.gif')
          ['1.gif']
          >>> glob.glob('**/*.txt', recursive=True)
          ['2.txt', 'sub/3.txt']
          >>> glob.glob('./**/', recursive=True)
          ['./', './sub/']

          fileinput與glob配合使用

          import fileinput
          import glob

          for line in fileinput.input(glob.glob("*.csv")):
              if fileinput.isfirstline():
                  print(f'Reading {fileinput.filename()}...'.center(50,'-'))
              print(str(fileinput.filelineno()) + ': ' + line.upper(), end="")

          輸出

          ---------------Reading info1.csv...---------------
          1: |編號(hào)| |性別| |年齡| |成績(jī)|
          2: 961067 |男| 23 97
          3: 969157 |男| 38 98
          ---------------Reading info2.csv...---------------
          1: "編號(hào)","性別","年齡","成績(jī)"
          2: 969237,"男",27,120
          3: 970394,"男",27,118

          更多使用方法請(qǐng)參見fileinput模塊[2]。

          codecs


          常用open方法操作文件,寫入str類型,不管字符串是什么編碼方式,此時(shí)一般不會(huì)出現(xiàn)什么問題。但有時(shí)候我們爬蟲或者其他方式得到一些數(shù)據(jù)寫入文件時(shí)會(huì)有編碼不統(tǒng)一的問題,或在自然語言處理過程中,使用open方法操作文件會(huì)經(jīng)常出現(xiàn)報(bào)錯(cuò),通常是編碼錯(cuò)誤。

          此時(shí)如若想繼續(xù)使用 open 方式打開,就需要先將輸入文件decode,統(tǒng)一轉(zhuǎn)為unicode ,再encode到目標(biāo)編碼方式,如gbk、utf-8等等。即

          input ---> encode ---> unicode ---> output

          幸運(yùn)的是,可以使用 codecs.open() 代替這一繁瑣操作。這種方法可以指定一個(gè)編碼打開文件,讀取返回的將是unicode。

          codecs.open()

          codecs.open(filename, 
                      mode='r'
                      encoding=None
                      errors='strict'
                      buffering=-1)

          使用給定的 mode 打開已編碼的文件并返回一個(gè) StreamReaderWriter 的實(shí)例,提供透明的編碼/解碼。

          mode
          參數(shù)可以是內(nèi)置 open()函數(shù)所接受的任意二進(jìn)制模式,默認(rèn)的文件模式為 'r',表示以讀取模式打開文件。'b' 會(huì)被自動(dòng)添加。

          encoding
          指定文件所要使用的編碼格式。允許任何編碼為字節(jié)串或從字節(jié)串解碼的編碼格式,而文件方法所支持的數(shù)據(jù)類型則取決于所使用的編解碼器。

          寫入時(shí),如果參數(shù)是unicode,則使用open()時(shí)指定的編碼進(jìn)行編碼后寫入;如果是str,則先根據(jù)源代碼文件聲明的字符編碼,解碼成unicode后再進(jìn)行前述操作。

          相對(duì)內(nèi)置的open()來說,這個(gè)方法比較不容易在編碼上出現(xiàn)問題,并且在速度不變的同時(shí),還兼容open()函數(shù)所有操作命令。

          應(yīng)用實(shí)例

          將未知編碼方式的csv文件轉(zhuǎn)為utf-8格式文件。

          import codecs

          src="......\\xxxx.csv"
          dst="......\\xxx_utf8.csv"

          def ReadFile(filePath):
              with codecs.open(filePath, "r"as f:
                  return f.read()

          def WriteFile(filePath, u, encoding="utf-8"):
              # with codecs.open(filePath,"w",encoding) as f:
              with codecs.open(filePath, "wb"as f:
                  f.write(u.encode(encoding, errors="ignore"))

          def CSV_2_UTF8(src, dst):
              content = ReadFile(src)
              WriteFile(dst, content, encoding="utf-8")
              
          CSV_2_UTF8(src, dst)

          更多相關(guān)方法可參見codecs模塊[3]。

          CSV


          CSV (Comma Separated Values)[4],即逗號(hào)分隔值(也稱字符分隔值,因?yàn)榉指舴梢圆皇嵌禾?hào)),是一種常用的文本格式,用以存儲(chǔ)表格數(shù)據(jù),包括數(shù)字或者字符。很多程序在處理數(shù)據(jù)時(shí)都會(huì)碰到csv這種格式的文件。

          python內(nèi)置了csv模塊。常用的有四個(gè)方法:

          csv.reader

          csv.reader(csvfile, 
                     dialect='excel'
                     **fmtparams)

          返回一個(gè)reader對(duì)象,該對(duì)象將逐行遍歷csvfile 。

          svfile
          可以是任何對(duì)象,文件對(duì)象和列表對(duì)象均適用。如果 csvfile 是文件對(duì)象,則打開它時(shí)應(yīng)使用 newline=''。

          dialect
          用于不同的 CSV 變種的特定參數(shù)組。

          fmtparams
          可以覆寫當(dāng)前變種格式中的單個(gè)格式設(shè)置。有關(guān)變種和格式設(shè)置參數(shù)的完整詳細(xì)信息,請(qǐng)參見 變種與格式參數(shù)[5] 。

          應(yīng)用實(shí)例

          import csv
          with open('info.csv', newline=''as csvfile:
              spamreader = csv.reader(csvfile
                                       , delimiter=' '
                                       , quotechar='|'
                                      ) 
              for row in spamreader:
                  print(row)
                  print(', '.join(row))

          輸出

          ['"編號(hào)","性別","年齡","成績(jī)"']
          "編號(hào)","性別","年齡","成績(jī)"
          ['961067,"男","23","97"']
          961067,"男","23","97"
          ['969157,"男","38","98"']
          969157,"男","38","98"

          以上用到的變種與格式參數(shù)解釋如下。

          delimiter
          一個(gè)用于分隔字段的單字符,默認(rèn)為 ' , '。

          quotechar
          一個(gè)單字符,用于包住含有特殊字符的字段,特殊字符如 定界符引號(hào)字符換行符。默認(rèn)為 ' " '。

          由于使用 open()來讀取 CSV 文件,因此默認(rèn)情況下,將使用系統(tǒng)默認(rèn)編碼來解碼文件并轉(zhuǎn)換為unicode,要使用其他編碼來解碼文件,可使用openencoding參數(shù):

          import csv
          with open('sample.csv', newline='', encoding='utf-8'as f:
              reader = csv.reader(f)
              for row in reader:
                  print(row)

          csv.writer

          csv.writer(csvfile, dialect='excel', **fmtparams)

          返回一個(gè) writer 對(duì)象,該對(duì)象將用戶的數(shù)據(jù)在給定的文件類對(duì)象上轉(zhuǎn)換為帶分隔符的字符串。None 值會(huì)寫入為空字符串。

          寫入前,所有非字符串?dāng)?shù)據(jù)都先用 str() 轉(zhuǎn)化為字符串再寫入。

          csvfile 可以是具有 write() 方法的任何對(duì)象。

          應(yīng)用案例

          import csv
          with open('info.csv''w', newline=''as csvfile:
              spamwriter = csv.writer(csvfile, delimiter=' ',
                                      quotechar='|', quoting=csv.QUOTE_NONNUMERIC)
              spamwriter.writerow(["編號(hào)","性別","年齡","成績(jī)"])
              spamwriter.writerow([961067,"男",23,97])
              spamwriter.writerow([969157,"男",38,98])

          輸出csv文件打開如下

          |編號(hào)| |性別| |年齡| |成績(jī)|
          961067 |男| 23 97
          969157 |男| 38 98

          參數(shù)quoting說明:
          控制 writer 何時(shí)生成引號(hào),以及 reader 何時(shí)識(shí)別引號(hào)。該屬性可以等于任何 QUOTE_* 常量,默認(rèn)為QUOTE_MINIMAL。

          QUOTE_* 常量包括:

          • csv.QUOTE_ALL
            指示 writer 對(duì)象給所有字段加上引號(hào)。

          • csv.QUOTE_MINIMAL
            指示 writer 對(duì)象僅為包含特殊字符(例如定界符、引號(hào)字符行結(jié)束符 中的任何字符)的字段加上引號(hào)。

          • csv.QUOTE_NONNUMERIC
            指示 writer 對(duì)象為所有非數(shù)字字段加上引號(hào)。
            指示 reader 將所有未用引號(hào)引出的字段轉(zhuǎn)換為 float 類型。

          • csv.QUOTE_NONE
            指示 writer 對(duì)象不使用引號(hào)引出字段。當(dāng) 定界符 出現(xiàn)在輸出數(shù)據(jù)中時(shí),其前面應(yīng)該有 轉(zhuǎn)義符。如果未設(shè)置 轉(zhuǎn)義符,則遇到任何需要轉(zhuǎn)義的字符時(shí),writer 都會(huì)拋出 Error 異常。
            指示 reader 不對(duì)引號(hào)字符進(jìn)行特殊處理。

          csv.DictReader

          csv.DictReader(*f*, 
                         *fieldnames=None*, 
                         *restkey=None*, 
                         *restval=None*, 
                         *dialect='excel'*, **args*, ***kwds*)

          創(chuàng)建一個(gè)對(duì)象,該對(duì)象在操作上類似于常規(guī) reader,但是將每行中的信息映射到一個(gè) dict,該 dict 的鍵由 fieldnames 可選參數(shù)給出。

          fieldnames
          參數(shù)是一個(gè) sequence。如果省略 fieldnames,則文件 f 第一行中的值將用作字段名。無論字段名是如何確定的,字典都將保留其原始順序。

          如果某一行中的字段多于字段名,則剩余數(shù)據(jù)會(huì)被放入一個(gè)列表,并與 restkey 所指定的字段名 (默認(rèn)為 None) 一起保存。如果某個(gè)非空白行的字段少于字段名,則缺失的值會(huì)使用 restval 的值來填充 (默認(rèn)為 None)。

          應(yīng)用實(shí)例

          import csv
          with open('info.csv', newline=''as csvfile:
              reader = csv.DictReader(csvfile)
              for row in reader:
                  print(row)

          注意:

          在 3.6 版更改: 返回的行現(xiàn)在的類型是 OrderedDict。
          在 3.8 版更改: 現(xiàn)在,返回的行是 dict類型。

          # python 3.6/3.7輸出:
          OrderedDict([('編號(hào)', '961067'), ('性別', '男'), ('年齡', '23'), ('成績(jī)', '97')])
          OrderedDict([('編號(hào)', '969157'), ('性別', '男'), ('年齡', '38'), ('成績(jī)', '98')])

          # python 3.8輸出
          {'編號(hào)': '961067', '性別': '男', '年齡': '23', '成績(jī)': '97'}
          {'編號(hào)': '969157', '性別': '男', '年齡': '38', '成績(jī)': '98'}

          Reader 對(duì)象的一些方法

          csvreader.line_num
          源迭代器已經(jīng)讀取了的行數(shù)。它與返回的記錄數(shù)不同,因?yàn)橛涗浛赡芸缭蕉嘈小?/p>

          csvreader.fieldnames
          字段名稱。如果在創(chuàng)建對(duì)象時(shí)未傳入字段名稱,則首次訪問時(shí)或從文件中讀取第一條記錄時(shí)會(huì)初始化此屬性。

          import csv
          with open('info.csv', newline=''as csvfile:
              reader = csv.DictReader(csvfile)
              print(f'文件字段名稱:{reader.fieldnames}\n')
              for row in reader:
                  print(f'讀取的第{reader.line_num}行.')
                  print(dict(row))

          輸出

          文件字段名稱:['編號(hào)''性別''年齡''成績(jī)']

          讀取的第2行.
          {'編號(hào)''961067''性別''男''年齡''23''成績(jī)''97'}
          讀取的第3行.
          {'編號(hào)''969157''性別''男''年齡''38''成績(jī)''98'}
          讀取的第4行.
          {'編號(hào)''969237''性別''男''年齡''27''成績(jī)''120'}
          讀取的第5行.
          {'編號(hào)''970394''性別''男''年齡''27''成績(jī)''118'}

          csv.DictWriter

          csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

          創(chuàng)建一個(gè)對(duì)象,該對(duì)象在操作上類似常規(guī) writer,但會(huì)將字典映射到輸出行。

          fieldnames 參數(shù)是由鍵組成的 sequence,它指定字典中值的順序,這些值會(huì)按指定順序傳遞給 writerow() 方法并寫入文件 f。

          如果字典缺少 fieldnames 中的鍵,則可選參數(shù) restval 用于指定要寫入的值。

          如果傳遞給 writerow() 方法的字典的某些鍵在 fieldnames 中找不到,則可選參數(shù) extrasaction 用于指定要執(zhí)行的操作。如果將其設(shè)置為默認(rèn)值 'raise',則會(huì)引發(fā) ValueError。如果將其設(shè)置為 'ignore',則字典中的其他鍵值將被忽略。

          應(yīng)用案例

          with open('info.csv''w', newline=''as csvfile:
              fieldnames = ['編號(hào)''性別''年齡''成績(jī)']
              writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_NONNUMERIC)

              writer.writeheader()
              writer.writerow({'編號(hào)'961067'性別''男''年齡'23'成績(jī)'97})
              writer.writerow({'編號(hào)'969157'性別''男''年齡'38'成績(jī)'98})

          寫入的csv文件打開結(jié)果如下

          "編號(hào)","性別","年齡","成績(jī)"
          961067,"男",23,97
          969157,"男",38,98

          Writer 對(duì)象的一些方法

          DictWriter.writeheader()
          writer 的文件對(duì)象中,寫入一行字段名稱(字段名稱在構(gòu)造函數(shù)中指定),并根據(jù)當(dāng)前設(shè)置的變種進(jìn)行格式化。

          csvwriter.writerow(row)
          將參數(shù) row 寫入 writer 的文件對(duì)象。

          csvwriter.writerows(rows)
          rows (即能迭代出多個(gè)上述 row 對(duì)象的迭代器)中的所有元素寫入 writer 的文件對(duì)象

          更多相關(guān)方法可參見csv模塊[6]。

          第三方模塊


          另外還有專門針對(duì)Word文件、Excel文件及PDF文件的模塊,這里只簡(jiǎn)單介紹下。

          word文件

          python-docx

          from docx import Document
          # 初始化一個(gè)實(shí)例
          document = Document()
          # 增加一集標(biāo)題
          document.add_heading('Document Title'0)

          PDF文件

          pdfplumber

          # 導(dǎo)入pdfplumber
          import pdfplumber
          # 讀取pdf文件,保存為pdf實(shí)例
          pdf =  pdfplumber.open("D:\\demo.pdf")
          # 訪問第一頁
          first_page = pdf.pages[0]
          # 自動(dòng)讀取表格信息,返回列表
          table = first_page.extract_table()

          Excel文件

          比較常用的Excel操作模塊有如下三種。

          • xlrd 讀取 .xls.xlsx 文件
          • xlwings 讀取 .xls.xlsx 文件
          • openpyxl 讀取 .xlsx 文件

          xlrd

          xlrd不能創(chuàng)建和保存Excel文件

          import xlrd
          # 打開Excel文件
          df = xlrd.open_workbook(name)
          # 查看所有sheet
          df.sheet_names()

          xlwings

          xlwings 直接對(duì)接的是 Excel 應(yīng)用程序,然后才是工作簿 books 和工作表 sheets,xlwings 需要安裝有 Excel 應(yīng)用程序的環(huán)境xlwings 可以讀取 .xls.xlsx 文件。

          import xlwings as xw
          # 程序可見,只打開不新建工作薄
          app = xw.App(visible=True, add_book=False
          app.display_alerts = False # 警告關(guān)閉
          app.screen_updating = False # 屏幕更新關(guān)閉
          # wb = app.books.open(xls_path)
          wb = app.books.open(xlsx_path)
          wb = app.books.add() # 創(chuàng)建文件
          wb.save() # 保存文件
          wb.close() # 關(guān)閉文件
          app.quit() # 關(guān)閉程序

          openpyxl

          openpyxl 可以讀取 .xlsx 文件,如果讀取.xls 文件會(huì)報(bào)錯(cuò)。

          import openpyxl
          # 讀取excel文件
          wb = openpyxl.load_workbook(xlsx_path)
          # 獲取工作表、新工作簿中指定即創(chuàng)建工作表
          sheet = wb.active
          # 保存文件
          wb.save()

          參考

          [1]

          pathlib模塊: https://docs.python.org/zh-cn/3/library/pathlib.html

          [2]

          fileinput模塊: https://docs.python.org/zh-cn/3/library/fileinput.html

          [3]

          codecs模塊: https://docs.python.org/zh-cn/3/library/codecs.html

          [4]

          CSV (Comma Separated Values: http://zh.wikipedia.org/zh-cn/逗號(hào)分隔值

          [5]

          變種與格式參數(shù): https://docs.python.org/zh-cn/3/library/csv.html#csv-fmt-params

          [6]

          csv模塊: https://docs.python.org/zh-cn/3/library/csv.html#index-0


          點(diǎn)擊下方卡片進(jìn)行關(guān)注:

          點(diǎn)分享
          點(diǎn)收藏
          點(diǎn)點(diǎn)贊
          點(diǎn)在看
          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看欧美黄片 | 久久免费国产视频 | 亚洲高清无码在线免费观看 | 欧美日韩一级免费电影 | 91精品秘 一区二区三区 |