精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讀取文件不再使用 With Open

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

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

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

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

回顧open函數(shù)

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

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

  • name: 要讀取的文件名稱。
  • mode?: 打開(kāi)文件的模式,選填。r, r+, w, w+, a, a+使用最多。
  • buffering: 文件所需的緩沖區(qū)大小, 選填。0表示無(wú)緩沖, 1表示線路緩沖。有四種打開(kāi)文件的不同方法(模式)
  • "r" - 讀取 - 默認(rèn)值。打開(kāi)文件進(jìn)行讀取,如果文件不存在則報(bào)錯(cuò)。
  • "a" - 追加 - 打開(kāi)供追加的文件,如果不存在則創(chuàng)建該文件。
  • "w" - 寫(xiě)入 - 打開(kāi)文件進(jìn)行寫(xiě)入,如果文件不存在則創(chuàng)建該文件。
  • "x" - 創(chuàng)建 - 創(chuàng)建指定的文件,如果文件存在則返回錯(cuò)誤。
  • 此外,可以指定文件是應(yīng)該作為二進(jìn)制還是文本模式進(jìn)行處理。
  • "t" - 文本 - 默認(rèn)值。文本模式。
  • "b" - 二進(jìn)制 - 二進(jìn)制模式(例如圖像)。

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

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)庫(kù)pathlib模塊的Path對(duì)路徑的操作會(huì)更簡(jiǎn)單。

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

Path.open

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

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

打開(kāi)路徑指向的文件,就像內(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讀與寫(xiě)

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

  • Path.read_text(): 以字符串形式返回路徑指向的文件的解碼后文本內(nèi)容。
  • Path.read_bytes(): 以二進(jìn)制/字節(jié)模式打開(kāi)路徑并以字節(jié)串的形式返回內(nèi)容。
  • Path.write_text(): 打開(kāi)路徑并向其寫(xiě)入字符串?dāng)?shù)據(jù)。
  • Path.write_bytes(): 以二進(jìn)制/字節(jié)模式打開(kāi)路徑并向其寫(xiě)入數(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'

更多詳情可參見(jiàn)pathlib模塊[1]。

fileinput

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

fileinput.input

input是fileinput模塊的初始接口,其使用也是較簡(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é)果寫(xiě)回文件,默認(rèn)不取代。
  • backup? 讀取時(shí)同時(shí)備份文件,可以指定備份的后綴名,比如 backup='.bak'。
  • mode? 文件讀取模式,fileinput 有且僅有這兩種讀取模式r?和 rb。
  • 默認(rèn)使用mode='r'
  • 如果文件是二進(jìn)制的,可以使用mode='rb' 模式。
  • openhook 支持用戶傳入自定義的對(duì)象讀取方法。fileinput 內(nèi)置了兩個(gè)勾子函數(shù):
  • fileinput.hook_encoded(encoding, errors=None)使用gzip? 和bz2模塊透明地打開(kāi) gzip 和 bzip2 壓縮的文件
  • fileinput.hook_compressed(filename, mode)使用給定的 encoding 和 errors 來(lái)讀取文件。

從標(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.txt 和 info.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.txt。glob()將產(chǎn)生如下結(jié)果。請(qǐng)注意路徑的任何開(kāi)頭部分都將被保留。

>>> 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)參見(jiàn) fileinput模塊[2]。

codecs

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

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

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

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

codecs.open()

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

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

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

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

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

相對(duì)內(nèi)置的open()來(lái)說(shuō),這個(gè)方法比較不容易在編碼上出現(xiàn)問(wè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)方法可參見(jiàn)**codecs模塊[3]**。

CSV

CSV[4] (Comma Separated Values),即逗號(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ì)象,則打開(kāi)它時(shí)應(yīng)使用 newline=''。

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

fmtparams可以覆寫(xiě)當(dāng)前變種格式中的單個(gè)格式設(shè)置。有關(guān)變種和格式設(shè)置參數(shù)的完整詳細(xì)信息,請(qǐng)參見(jiàn) 變種與格式參數(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()來(lái)讀取 CSV 文件,因此默認(rèn)情況下,將使用系統(tǒng)默認(rèn)編碼來(lái)解碼文件并轉(zhuǎn)換為unicode,要使用其他編碼來(lái)解碼文件,可使用open的encoding參數(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ì)寫(xiě)入為空字符串。

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

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文件打開(kāi)如下

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

參數(shù)quoting說(shuō)明:控制 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 第一行中的值將用作字段名。無(wú)論字段名是如何確定的,字典都將保留其原始順序。

如果某一行中的字段多于字段名,則剩余數(shù)據(jù)會(huì)被放入一個(gè)列表,并與 restkey 所指定的字段名 (默認(rèn)為 None) 一起保存。如果某個(gè)非空白行的字段少于字段名,則缺失的值會(huì)使用 restval 的值來(lái)填充 (默認(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í)未傳入字段名稱,則首次訪問(wèn)時(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() 方法并寫(xiě)入文件 f 。

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

如果傳遞給 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})

寫(xiě)入的csv文件打開(kāi)結(jié)果如下

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

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

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

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

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

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

第三方模塊

另外還有專門(mén)針對(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")
# 訪問(wèn)第一頁(yè)
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
# 打開(kāi)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
# 程序可見(jiàn),只打開(kāi)不新建工作薄
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()

另外還有很強(qiáng)大的pandas模塊,具體可參見(jiàn)Python數(shù)據(jù)分析實(shí)戰(zhàn)之?dāng)?shù)據(jù)獲取三大招,本文不在贅述。

參考資料

[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: 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

責(zé)任編輯:武曉燕 來(lái)源: 數(shù)據(jù)STUDIO
相關(guān)推薦

2023-03-06 00:19:17

ClosedAIOpenAI知識(shí)產(chǎn)權(quán)

2021-10-09 14:25:21

微信相冊(cè)移動(dòng)應(yīng)用

2013-06-08 13:29:27

Android開(kāi)發(fā)DOM讀取XMLXML解析

2011-07-05 17:38:52

QT Sqlite

2019-09-09 16:10:32

ETL數(shù)據(jù)科學(xué)數(shù)據(jù)

2023-04-04 19:14:40

Linux發(fā)行版Alpine

2021-08-02 15:02:37

Go Excelize 開(kāi)發(fā)

2018-10-22 20:23:26

JDKJavaOracle

2022-12-05 11:44:49

PrintDebugIceCream

2024-05-08 14:05:03

時(shí)間序列數(shù)據(jù)

2009-11-27 13:26:15

Open Suse

2023-01-05 11:34:46

PandasMerge方法

2021-07-08 10:50:02

Go語(yǔ)言16GB文件代碼

2015-11-26 10:57:56

DockerOpen vSwitc

2021-06-28 11:15:22

Go語(yǔ)言16GB文件

2009-07-10 10:37:11

WINAPI

2009-11-03 14:22:10

ADO.NET Exc

2024-06-25 09:08:24

.NETCSV文件

2011-08-10 09:25:16

BtrfsFedora 16

2010-03-16 08:54:47

Windows 7庫(kù)文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

www在线免费观看| 亚洲欧美丝袜| 男女性高潮免费网站| 超碰一区二区| 国内精品久久久久影院一蜜桃| 中文字幕少妇一区二区三区| 欧美二区在线视频| 欧美另类极品| 99久久99久久久精品齐齐| 国产精品久久久久不卡| 日韩av在线导航| 美女被啪啪一区二区| 国产免费观看av| 欧美成免费一区二区视频| 精品国产免费久久| 六月丁香婷婷激情| 91丨九色丨蝌蚪丨对白| 国产日韩亚洲| 色综合久久久久久中文网| 亚洲码无人客一区二区三区| 国产精品亚洲四区在线观看| 一本色道久久综合亚洲精品按摩| 欧美一区二区福利| 中文字幕1区2区3区| 亚洲美女少妇无套啪啪呻吟| 精品国产一区二区三区在线观看| 欧美一区二区免费在线观看| 成人在线视频国产| 欧美一a一片一级一片| 欧美成人高潮一二区在线看| 成人在线视频亚洲| 欧美激情中文不卡| 欧美男人的天堂| 免费av网站观看| 国产乱码精品一区二区三| 国产精品三级网站| 日韩精品一区二区亚洲av| 精品91在线| 欧美激情精品久久久久久黑人| 国产麻豆a毛片| 国产调教一区二区三区| 精品视频久久久久久久| fc2成人免费视频| 中文字幕久久精品一区二区| 91麻豆精品国产91久久久使用方法| 黄色三级视频在线| av激情成人网| 欧美日韩一区成人| 午夜在线观看av| 全球最大av网站久久| 在线看国产一区二区| 国产成人久久婷婷精品流白浆| 僵尸再翻生在线观看| 午夜一区二区三区视频| 老太脱裤让老头玩ⅹxxxx| av日韩中文| 欧美日韩国产在线| 人妻精品无码一区二区三区| 成人免费看黄| 欧美专区日韩专区| 91女神在线观看| **国产精品| 欧美一级电影网站| 亚洲美女精品视频| 清纯唯美亚洲经典中文字幕| 精品小视频在线| 波多野结衣av在线观看| 日韩精品诱惑一区?区三区| 色七七影院综合| 成人免费视频国产免费观看| 韩日成人在线| 欧美诱惑福利视频| 在线观看色网站| 国产.欧美.日韩| 精品久久久久久一区| 黄色软件在线观看| 国产精品人妖ts系列视频| 日本三级中文字幕在线观看| 欧美1—12sexvideos| 欧美视频第一页| 天天色综合天天色| 2020最新国产精品| 亚洲欧洲国产精品| 国产真实乱在线更新| 黄色成人在线网址| 国产精品aaaa| 精品国产18久久久久久| 91亚洲资源网| 综合久久国产| 超碰在线资源| 欧美丝袜丝交足nylons| 宇都宫紫苑在线播放| 精品午夜电影| 搡老女人一区二区三区视频tv| 久久久久久久久精| 天堂成人国产精品一区| 91成人免费观看| 国产资源在线播放| 亚洲综合色视频| 欧美丰满熟妇xxxxx| 日韩精品一级| 一个色综合导航| 欧美日韩免费做爰视频| 老司机免费视频久久| 99久久免费国| 91在线直播| 欧美视频第一页| 无码人妻一区二区三区精品视频 | 天天影视网天天综合色在线播放| 欧美精品第三页| julia中文字幕一区二区99在线| 亚洲性xxxx| 偷偷操不一样的久久| 极品少妇xxxx精品少妇| 欧美一区二区视频17c| 男女在线观看视频| 岛国精品视频在线播放| 中文字幕在线观看视频www| 精品国产欧美日韩| 欧美一级片在线播放| 成 人 免费 黄 色| 亚洲欧美成aⅴ人在线观看| 日本男人操女人| 免费看久久久| 久久久久久有精品国产| 99热这里只有精| 国产精品久线在线观看| 欧美牲交a欧美牲交aⅴ免费真 | 永久免费看mv网站入口| 久久婷婷激情| 91免费综合在线| 日本在线免费| 欧美亚日韩国产aⅴ精品中极品| 中文字幕一区二区人妻电影丶| 欧美成人久久| 成人免费网站在线| 无遮挡的视频在线观看 | 国产精品国产三级国产a| 国产精品丝袜久久久久久消防器材| 亚洲日本va中文字幕| 麻豆国产精品va在线观看不卡| 亚洲专区在线播放| 国产精品私人影院| 中文字幕第38页| 日韩国产一区二区| 国产精品美女主播在线观看纯欲| 久草在现在线| 91久久线看在观草草青青| 免费a级黄色片| 天堂va蜜桃一区二区三区 | 综合久久一区| 成人亚洲欧美一区二区三区| 黄视频在线观看网站| 欧美一区二区三区在| 永久免费看黄网站| 国产成人精品一区二区三区四区 | 91精品视频网| 精品国产欧美日韩不卡在线观看| 精品一区二区三区在线视频| 一区二区三区不卡在线| 亚洲三级电影| 色中色综合影院手机版在线观看| 日本黄色免费视频| 欧美午夜女人视频在线| 蜜桃久久精品乱码一区二区| 蜜桃精品在线| 色婷婷av一区二区三区久久| 国产又粗又猛又黄又爽无遮挡| 亚洲人成精品久久久久| 婷婷五月精品中文字幕| 国产精品毛片在线| 亚洲精品9999| 一区二区三区四区高清视频| 2021久久精品国产99国产精品| 成人在线免费公开观看视频| 5858s免费视频成人| 久久黄色免费视频| 久久久亚洲精品一区二区三区| 中文字幕欧美人妻精品一区| 91精品国偷自产在线电影| 国产精品青青草| 欧美色网在线| 午夜精品久久久久影视| wwwwwxxxx日本| 午夜欧美视频| 欧美日韩在线观看一区二区三区| 91成人app| 国内精品久久久久影院 日本资源| 欧美成熟毛茸茸| 91精品国产综合久久久久久漫画| 乱子伦一区二区| 国产精品第5页| 国产精品欧美经典| 性感美女一区二区三区| 日本中文字幕一区二区有限公司| 欧美a级黄色大片| 亚洲福利合集| 亚洲国产小视频在线观看| 婷婷伊人五月天| 久久综合九色综合97_久久久| xxxx在线免费观看| 国产精品嫩草99av在线| 国产香蕉一区二区三区| 国产一区二区三区四区| 国产精品国产精品国产专区蜜臀ah| 新片速递亚洲合集欧美合集| 欧美第一淫aaasss性| 国产福利在线视频| 亚洲第一在线视频| 国产美女免费网站| 激情综合色播激情啊| 91久久精品国产91性色| 中文字幕黄色av| 亚洲国产综合色| 刘亦菲国产毛片bd| 成人ar影院免费观看视频| 大肉大捧一进一出好爽动态图| 99香蕉久久| 国产精品久久一区| 亚洲丝袜精品| 亚洲香蕉成人av网站在线观看 | 久久99精品久久久久婷婷| 亚洲中文字幕无码av永久| 99精品电影| 国产清纯在线一区二区www| 青青草精品毛片| av老司机在线观看| 91精品国产福利在线观看 | 国产亚洲精品久久久久婷婷瑜伽| 国产精品r级在线| 99爱在线观看| 国色天香2019中文字幕在线观看| 高h视频在线| 国产一区二区日韩精品欧美精品| 污视频在线免费观看| 精品国产a毛片| 99久久久久成人国产免费| 精品视频一区 二区 三区| 国产乱码久久久久久| 久久在线观看免费| 免费看91视频| 国产精品自拍av| 中文久久久久久| 日本91福利区| 日韩毛片在线免费看| 蜜桃伊人久久| 男人揉女人奶房视频60分| 你懂的一区二区| 日韩欧美视频免费在线观看| 欧美激情第10页| www.男人天堂网| 香蕉视频在线看| 91老司机福利 在线| 黄色在线免费播放| 国产一区二区三区不卡在线观看| 日本在线观看视频一区| 久久99蜜桃精品| 特黄特黄一级片| 国产一区二区视频在线播放| 天堂在线精品视频| 成人在线一区二区三区| 91精品人妻一区二区三区蜜桃2| 福利一区二区在线观看| 日本一卡二卡在线| 国产午夜一区二区三区| 日本午夜精品视频| 亚洲激情网站免费观看| 日韩黄色在线视频| 色999日韩国产欧美一区二区| 97免费在线观看视频| 26uuu国产日韩综合| 日本一卡二卡在线播放| 中文字幕一区二区三区不卡| 亚洲黄色小说在线观看| 91麻豆swag| 久久久久久久麻豆| 午夜久久久影院| 国产黄色片在线免费观看| 婷婷开心激情综合| 亚洲视频一区在线播放| 精品久久久久久亚洲综合网| 亚洲av无码国产精品久久不卡| 欧美一区二区在线免费播放| 亚洲色偷精品一区二区三区| 日韩av网址在线观看| 五月婷婷丁香网| 欧美精品一区二区在线播放 | 日韩中文字幕一区二区高清99| 国产欧美综合精品一区二区| 成人情趣视频| 久久这里只有精品23| 另类专区欧美蜜桃臀第一页| 极品白嫩的小少妇| 国产精品久久久久久久久果冻传媒| 久久精品久久国产| 欧美日韩激情一区二区| 免费的黄色av| 久久久精品影院| 电影天堂国产精品| 国产精品亚洲不卡a| 第九色区aⅴ天堂久久香| 18禁网站免费无遮挡无码中文 | 成人黄色免费网站在线观看| 欧美美女黄色| 精品免费久久久久久久| 蜜桃av一区二区| 在线免费观看黄色小视频| 亚洲精品成人精品456| 中文字幕一级片| 日韩精品免费在线播放| 男人天堂亚洲| 91久久国产婷婷一区二区| heyzo久久| 国产男女无遮挡| 成人sese在线| 久久久久亚洲av无码专区体验| 欧美色综合久久| 黄色美女网站在线观看| 久久久在线观看| 国产亚洲观看| 一区二区在线观| 免费成人av在线播放| 中文字幕国产专区| 欧美日韩亚洲激情| 天天操天天干天天干| 欧美国产亚洲视频| 欧美2区3区4区| 7777在线视频| 国产一区福利在线| 娇小11一12╳yⅹ╳毛片| 欧美三区在线视频| 福利成人在线观看| 国产精品69久久久久| 国产va免费精品观看精品视频 | 桃子视频成人app| 欧美另类视频在线| 久久久亚洲一区| 国产精品毛片一区二区| 欧美性猛交xxxx免费看| 日本高清中文字幕二区在线| 91av在线网站| 要久久电视剧全集免费| 日韩精品视频一区二区在线观看| 99re这里只有精品首页| 黄色片视频网站| 日韩精品极品在线观看播放免费视频 | 国产欧美日韩另类一区| 国产精华7777777| 中文字幕免费精品一区高清| 成人福利片在线| 中文字幕中文字幕99| 精品午夜久久福利影院| 日韩女优一区二区| 精品黑人一区二区三区久久| 草美女在线观看| 免费电影一区| 七七婷婷婷婷精品国产| 四虎影院中文字幕| 欧美成人在线直播| 三妻四妾完整版在线观看电视剧| 欧美日韩高清免费| 麻豆国产一区二区| 青青草原在线免费观看视频| 亚洲成人久久久| 成人做爰视频www网站小优视频| 日韩欧美精品久久| 国产乱色国产精品免费视频| 久久精品免费在线| 亚洲欧洲日本专区| vam成人资源在线观看| 996这里只有精品| 久久亚洲二区三区| 亚洲资源在线播放| 久久久久久久久久久国产| 一呦二呦三呦国产精品| www.99r| 香蕉加勒比综合久久| 国自产拍在线网站网址视频| 国产一区二区在线免费视频| 国产精品国码视频| 午夜精产品一区二区在线观看的| 欧美美女网站色| 超碰99在线| 制服丝袜综合日韩欧美| 不卡一区在线观看| 在线观看中文字幕网站| 久久久噜久噜久久综合| 精品久久影院| 国产情侣久久久久aⅴ免费| 亚洲欧美日韩在线| 精品影院一区| 国产精品av在线| 亚洲狼人精品一区二区三区| 婷婷丁香综合网| 日韩精品小视频| 久久精品一级| 91激情视频在线| 午夜精品福利一区二区三区蜜桃| 天堂中文8资源在线8| 欧美成人一区二区在线|