漲知識!比Open更適合讀取文件的Python內置模塊

2022-01-01 Python數據之道

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

Python語言中,負責文件操作的稱為文件對象,文件對象不僅可以訪問存儲在磁碟中的文件,也可以訪問網絡文件。文件對象通過open函數得到,獲取文件對象後,就可以使用文件對象提供的方法來讀寫文件。

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

回顧open函數

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

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

name: 要讀取的文件名稱。

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

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

"r" - 讀取 - 默認值。打開文件進行讀取,如果文件不存在則報錯。"a" - 追加 - 打開供追加的文件,如果不存在則創建該文件。"w" - 寫入 - 打開文件進行寫入,如果文件不存在則創建該文件。"x" - 創建 - 創建指定的文件,如果文件存在則返回錯誤。

此外,可以指定文件是應該作為二進位還是文本模式進行處理。

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

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

pathlib

以前在Python中操作文件路徑,更多的時候是使用os模塊。Python3的系統標準庫pathlib模塊的Path對路徑的操作會更簡單。

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

Path.open

在pathlib裡如果要打開一個文件十分的簡單。

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

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

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

結果

"編號","性別","年齡","成績"

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

Path讀與寫

對於簡單的文件讀寫,在pathlib模塊中有幾個簡便的方法:

Path.read_text(): 以字符串形式返迴路徑指向的文件的解碼後文本內容。

Path.read_bytes(): 以二進位/字節模式打開路徑並以字節串的形式返回內容。

Path.write_text(): 打開路徑並向其寫入字符串數據。

Path.write_bytes(): 以二進位/字節模式打開路徑並向其寫入數據。

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

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

fileinput.input

input是fileinput模塊的初始接口,其使用也是較簡單。

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

files 需要讀取的文件對象,可迭代對象。

inplace 標準輸出重定向替換,表示是否將標準輸出的結果寫回文件,默認不取代。

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

mode  文件讀取模式,fileinput 有且僅有這兩種讀取模式r和 rb。

如果文件是二進位的,可以使用mode='rb' 模式。

openhook 支持用戶傳入自定義的對象讀取方法。fileinput 內置了兩個勾子函數:

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

input()不傳任何參數時,fileinput 默認會以 stdin 作為輸入源。

運行stdinput.py後,在編譯器中輸入內容,程序會自動讀取並再列印一次。

# 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行: |編號| |性別| |年齡| |成績|  
info1.csv 第2行: 961067 |男| 23 97  
info1.csv 第3行: 969157 |男| 38 98  
info2.csv 第4行: "編號","性別","年齡","成績"  
info2.csv 第5行: 969237,"男",27,120  
info2.csv 第6行: 970394,"男",27,118  

由於 info.txt 和 info.txt 的內容被整合成一個文件對象 file ,因此 fileinput.lineno() 只有在讀取一個文件時,才是原文件中真實的行號。如果想要在讀取多個文件的時候,也能讀取原文件的真實行號,可以使用 fileinput.filelineno() 方法。

以上幾個常用對方法解釋如下。

fileinput.filename()

返回當前被讀取的文件名。在第一行被讀取之前,返回 None。

fileinput.lineno()

返回已被讀取的累計行號。在第一行被讀取之前,返回 0。在最後一個文件的最後一行被讀取之後,返回該行的行號。

fileinput.filelineno()

返回當前文件中的行號。在第一行被讀取之前,返回 0。在最後一個文件的最後一行被讀取之後,返回此文件中該行的行號。

讀取單個文件

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

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行: "編號","性別","年齡","成績"
info2.csv 第2行: 969237,"男",27,120
info2.csv 第3行: 970394,"男",27,118

與glob配合批量讀取glob簡介

glob是python自帶的一個操作文件的相關模塊,可以對文件夾下所有文件進行遍歷,並將符合匹配模式的文件名保存為一個list列表。

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

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

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

實例

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

>>> 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: |編號| |性別| |年齡| |成績|
2: 961067 |男| 23 97
3: 969157 |男| 38 98
Reading info2.csv...
1: "編號","性別","年齡","成績"
2: 969237,"男",27,120
3: 970394,"男",27,118

更多使用方法請參見fileinput模塊[2]。

codecs

常用open方法操作文件,寫入str類型,不管字符串是什麼編碼方式,此時一般不會出現什麼問題。但有時候我們爬蟲或者其他方式得到一些數據寫入文件時會有編碼不統一的問題,或在自然語言處理過程中,使用open方法操作文件會經常出現報錯,通常是編碼錯誤。

此時如若想繼續使用 open 方式打開,就需要先將輸入文件decode,統一轉為unicode ,再encode到目標編碼方式,如gbk、utf-8等等。即

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

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

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

使用給定的 mode 打開已編碼的文件並返回一個 StreamReaderWriter 的實例,提供透明的編碼/解碼。

mode
參數可以是內置 open()函數所接受的任意二進位模式,默認的文件模式為 'r',表示以讀取模式打開文件。'b' 會被自動添加。

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

寫入時,如果參數是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據原始碼文件聲明的字符編碼,解碼成unicode後再進行前述操作。

相對內置的open()來說,這個方法比較不容易在編碼上出現問題,並且在速度不變的同時,還兼容open()函數所有操作命令。

應用實例

將未知編碼方式的csv文件轉為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)

更多相關方法可參見codecs模塊[3]。

CSV

CSV (Comma Separated Values)[4],即逗號分隔值(也稱字符分隔值,因為分隔符可以不是逗號),是一種常用的文本格式,用以存儲表格數據,包括數字或者字符。很多程序在處理數據時都會碰到csv這種格式的文件。

python內置了csv模塊。常用的有四個方法:

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

返回一個reader對象,該對象將逐行遍歷csvfile 。

svfile
可以是任何對象,文件對象和列表對象均適用。如果 csvfile 是文件對象,則打開它時應使用 newline=''。

dialect
用於不同的 CSV 變種的特定參數組。

fmtparams
可以覆寫當前變種格式中的單個格式設置。有關變種和格式設置參數的完整詳細信息,請參見 變種與格式參數[5] 。

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

輸出

['"編號","性別","年齡","成績"']
"編號","性別","年齡","成績"
['961067,"男","23","97"']
961067,"男","23","97"
['969157,"男","38","98"']
969157,"男","38","98"

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

delimiter
一個用於分隔欄位的單字符,默認為 ' , '。

quotechar
一個單字符,用於包住含有特殊字符的欄位,特殊字符如 定界符 或 引號字符 或 換行符。默認為 ' " '。

由於使用 open()來讀取 CSV 文件,因此默認情況下,將使用系統默認編碼來解碼文件並轉換為unicode,要使用其他編碼來解碼文件,可使用open的encoding參數:

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)

返回一個 writer 對象,該對象將用戶的數據在給定的文件類對象上轉換為帶分隔符的字符串。None 值會寫入為空字符串。

寫入前,所有非字符串數據都先用 str() 轉化為字符串再寫入。

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

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

輸出csv文件打開如下

|編號| |性別| |年齡| |成績|
961067 |男| 23 97
969157 |男| 38 98

參數quoting說明:
控制 writer 何時生成引號,以及 reader 何時識別引號。該屬性可以等於任何 QUOTE_* 常量,默認為QUOTE_MINIMAL。

QUOTE_* 常量包括:

csv.QUOTE_ALL
指示 writer 對象給所有欄位加上引號。

csv.QUOTE_MINIMAL
指示 writer 對象僅為包含特殊字符(例如定界符引號字符行結束符 中的任何字符)的欄位加上引號。

csv.QUOTE_NONNUMERIC
指示 writer 對象為所有非數字欄位加上引號。
指示 reader 將所有未用引號引出的欄位轉換為 float 類型。

csv.QUOTE_NONE
指示 writer 對象不使用引號引出欄位。當 定界符 出現在輸出數據中時,其前面應該有 轉義符。如果未設置 轉義符,則遇到任何需要轉義的字符時,writer 都會拋出 Error 異常。
指示 reader 不對引號字符進行特殊處理。

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

創建一個對象,該對象在操作上類似於常規 reader,但是將每行中的信息映射到一個 dict,該 dict 的鍵由 fieldnames 可選參數給出。

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

如果某一行中的欄位多於欄位名,則剩餘數據會被放入一個列表,並與 restkey 所指定的欄位名 (默認為 None) 一起保存。如果某個非空白行的欄位少於欄位名,則缺失的值會使用 restval 的值來填充 (默認為 None)。

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

注意:

在 3.6 版更改: 返回的行現在的類型是 OrderedDict。
在 3.8 版更改: 現在,返回的行是 dict類型。

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

# python 3.8輸出
{'編號': '961067', '性別': '男', '年齡': '23', '成績': '97'}
{'編號': '969157', '性別': '男', '年齡': '38', '成績': '98'}

Reader 對象的一些方法

csvreader.line_num
源迭代器已經讀取了的行數。它與返回的記錄數不同,因為記錄可能跨越多行。

csvreader.fieldnames
欄位名稱。如果在創建對象時未傳入欄位名稱,則首次訪問時或從文件中讀取第一條記錄時會初始化此屬性。

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

輸出

文件欄位名稱:['編號', '性別', '年齡', '成績']

讀取的第2行.
{'編號': '961067', '性別': '男', '年齡': '23', '成績': '97'}
讀取的第3行.
{'編號': '969157', '性別': '男', '年齡': '38', '成績': '98'}
讀取的第4行.
{'編號': '969237', '性別': '男', '年齡': '27', '成績': '120'}
讀取的第5行.
{'編號': '970394', '性別': '男', '年齡': '27', '成績': '118'}

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

創建一個對象,該對象在操作上類似常規 writer,但會將字典映射到輸出行。

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

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

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

應用案例
with open('info.csv', 'w', newline='') as csvfile:
    fieldnames = ['編號', '性別', '年齡', '成績']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_NONNUMERIC)

    writer.writeheader()
    writer.writerow({'編號': 961067, '性別': '男', '年齡': 23, '成績': 97})
    writer.writerow({'編號': 969157, '性別': '男', '年齡': 38, '成績': 98})

寫入的csv文件打開結果如下

"編號","性別","年齡","成績"
961067,"男",23,97
969157,"男",38,98

Writer 對象的一些方法

DictWriter.writeheader()
在 writer 的文件對象中,寫入一行欄位名稱(欄位名稱在構造函數中指定),並根據當前設置的變種進行格式化。

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

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

更多相關方法可參見csv模塊[6]。

第三方模塊

另外還有專門針對Word文件、Excel文件及PDF文件的模塊,這裡只簡單介紹下。

word文件python-docx
from docx import Document
# 初始化一個實例
document = Document()
# 增加一集標題
document.add_heading('Document Title', 0)

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

Excel文件

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

xlwings 讀取 .xls.xlsx 文件xlrd

xlrd不能創建和保存Excel文件

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

xlwings

xlwings 直接對接的是 Excel 應用程式,然後才是工作簿 books 和工作表 sheets,xlwings 需要安裝有 Excel 應用程式的環境xlwings 可以讀取 .xls 和 .xlsx 文件。

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

openpyxl

openpyxl 可以讀取 .xlsx 文件,如果讀取.xls 文件會報錯。

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

另外還有很強大的pandas模塊,具體可參見Python數據分析實戰之數據獲取三大招,本文不在贅述。

參考[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/逗號分隔值

[5]

變種與格式參數: 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


相關焦點

  • Python內置模塊sys介紹
    # 導入模塊import sys# sys模塊用來處理Python運行時配置以及資源,從而可以與當前程序之外的系統環境交互
  • 超詳細的Python文件操作知識
    為了方便大家,這裡對各種文件操作的知識進行匯總。一文在手,無須它求!來一起學習吧。--- 以下是正文 ---本文分七個模塊為大家詳細介紹python中文件操縱相關知識,閒話少說,讓我們開始!with open(r'd:\測試文件.txt', mode='r', encoding='utf-8') as f1: content = f1.read()    print(content)open()內置函數,open底層調用的是作業系統的接口。
  • 用 Python 內置模塊處理 ini 配置文件
    (https://github.com/DahlitzFlorian/how-to-work-with-config-files-in-python-article-snippets)文件結構在編寫代碼之前,讓我們看一下實際配置文件的結構。
  • Python內置模塊之OS
    今天分享下python內置模塊中的OS模塊,os模塊是大家經常會使用到的,雖然有path這個模塊替代os, 但是大家可能還是比較熟悉os吧,那麼我自己也總結下os模塊中常用的一些方法和屬性。怎麼開始用這個模塊呢,因為是內置的,所以不用額外安裝,直接import即可1.系統操作相關方法和變量用途os.name查看當前作業系統的名稱,windows返回nt,linux返回posixos.environ獲取系統環境變量os.sep
  • python讀寫csv文件
    文件讀寫的經典操作方式如下,通過內置的open函讀取到每行內容,按照指定的分隔符進行分隔,然後對每一列的內容進行處理。
  • Python讀取csv文件常見的兩種方法
    「CSV」並不是一種單一的、定義明確的格式(儘管RFC 4180有一個被通常使用的定義)。因此在實踐中,術語「CSV」泛指具有以下特徵的任何文件:1. 純文本,使用某個字符集,比如ASCII、Unicode、EBCDIC或GB2312;2. 由記錄組成(典型的是每行一條記錄);3.
  • Python讀寫文件open的使用解讀
    文件打開 open()和操作方法python 讀取文件自帶方法 open,適用於可以用記事本 txt 格式打開的文件,都可以用 open 方法打開2   python 打開文件3   python 讀取文件內容
  • Python文件讀寫指南
    從文件中讀取內容有如下方法:file.read([size])從文件讀取指定的字節數,如果未給定或為負則讀取所有。file.readline([size])讀取整行,包括 "\n" 字符。python is a cat.this is the end.總結一下,readline()比較雞肋,不咋用;read()適合讀取內容較少的情況,或者是需要一次性處理全部內容的情況;而readlines()用的較多,比較靈活,因為for循環是一種迭代器,每次加載部分內容,既減少內存壓力,又方便逐行對數據處理。
  • CSV文件在Python中的幾種處理方式
    import sysinfile = sys.argv[1]outfile = sys.argv[2]Step 2:使用open內置函數獲取文件對象。with open(infile, "r", newline='') as fr, open(outfile, "w", newline='') as fw:Step 3:使用文件對象的readline方法或者迭代器的next方法讀取表頭(文件對象是一個迭代器對象,支持迭代協議),使用str.split方法對表頭進行拆分(注意,要使用strip函數去掉尾部換行符)。
  • 詳細的Python文件操作
    為了方便大家,這裡對各種文件操作的知識進行匯總。一文在手,無須它求!來一起學習吧。--- 以下是正文 ---本文分七個模塊為大家詳細介紹python中文件操縱相關知識,閒話少說,讓我們開始!.read print(content)open內置函數,open底層調用的是作業系統的接口。
  • Python基礎(三)丨數據文件讀取
    用python或其他語言編寫的應用程式若想要把數據永久保存下來,必須要保存於硬碟中,這就涉及到應用程式要操作硬體,但應用程式是無法直接操作硬體的,這就用到了作業系統。作業系統把複雜的硬體操作封裝成簡單的接口給用戶/應用程式使用,其中文件就是作業系統提供給應用程式來操作硬碟虛擬概念,用戶或應用程式通過操作文件,可以將自己的數據永久保存下來。
  • python:configparser(配置文件讀取操作)
    幾乎所有的應用程式運行起來的時候都需要讀取幾個配置文件,python中提供了configparser標準庫來進行操作配置文件,對.text、.ini的文件都是可以操作的使用的時候直接引包即可,因為安裝python的是已經默認安裝了
  • Python 實例:讀寫文件
    Python內置了讀寫文件的函數,用法和C語言的讀寫文件非常類似。在磁碟上讀寫文件的功能都是由作業系統提供的,現代作業系統不允許普通的程序直接操作磁碟,所以,讀寫文件就是請求作業系統打開一個文件對象(通常稱為文件描述符),然後,通過作業系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。
  • n種方式教你用python讀寫excel等數據文件
    下面整理下python有哪些方式可以讀寫數據文件。1. read、readline、readlinesread()  :一次性讀取整個文件內容。推薦使用read(size)方法,size越大運行時間越長readline()  :每次讀取一行內容。
  • n種方式教你用Python讀寫Excel等數據文件
    下面整理下python有哪些方式可以讀寫數據文件。1. read、readline、readlinesread()  :一次性讀取整個文件內容。推薦使用read(size)方法,size越大運行時間越長readline()  :每次讀取一行內容。
  • Python內置OS模塊用法詳解
    作者:是甜甜呢來源:早起PythonPython內置OS模塊用法詳解
  • Python內置模塊os介紹
    # 內置模塊# Python語言強大的地方就在於它擁有非常強大的模塊系統# 使用只需要用 import 導入即可
  • Python3的pathlib模塊:馴服文件系統
    python文件路徑處理時的問題處理文件和與文件系統交互很重要,原因很多。 最簡單的情況可能只涉及讀取或寫入文件,但有時會是更複雜的任務。Python 3.4中引入了pathlib模塊(PEP 428)來處理這些挑戰。 它在一個地方收集必要的功能,並通過易於使用的Path對象上的方法和屬性使其可用。早期,其他軟體包仍然使用字符串作為文件路徑,但從Python 3.6開始,pathlib模塊在整個標準庫中得到支持,部分原因是由於增加了文件系統路徑協議。
  • 如何使用python socket模塊實現簡單的文件下載
    這篇文章主要介紹了如何使用python socket模塊實現簡單的文件下載,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
  • 用 Python 讀取資源文件?這個技巧保你漲姿勢
    我們知道,當你把一個資源文件和一個.py文件放在一起的時候,你可以直接在這個.py文件中,使用文件名讀取它。這是因為,我們的入口程序在 ~/get_title文件夾中,而test.txt文件在~/get_title/util文件夾中。因為我們運行的是main.py,所以 Python 會在~/get_title文件夾裡面尋找test.txt,自然就找不到了。如果是引用包裡面的其他模塊,可以使用相對路徑。