python學習筆記(五)文件操作

 

目錄

(一)路徑和路徑名

1)絕對路徑和相對路徑

2)當前工作目錄

3)使用pathlib模塊訪問目錄

4)路徑名的處理

使用os.path處理路徑名

用pathlib處理路徑名

(二)獲取文件信息

(三)文件系統的其他操作

設計一個計算文件大小的程序

(四)file對象

1)打開和關閉文件

2)使用with關鍵字

3)讀寫文本函數

readlines函數

將file對象視爲迭代器

寫入文件

(五)文件操作的其他模塊


文件操作涉及兩件事情,即基本的I/O操作和文件系統操作(如文件的命名、創建、移動和引用)。

Python中處理文件路徑和文件系統操作的傳統方式,是通過os和os.path模塊中的函數來完成的。自Python3.5開始,引入了新的pathlib庫,可以用更加面向對象、更統一的方式來完成文件操作。

 

(一)路徑和路徑名

所有的操作系統都會用字符串來引用文件和目錄,字符串中包含了給定文件或目錄的名稱。這種字符串通常被稱爲“路徑名”,有時簡稱爲路徑。因爲路徑名是個字符串,所以在使用時也帶來了一定的複雜性。Python做了大量工作,提供了很多函數來避免這種複雜性。

路徑名在各種操作系統中的寫法都非常相似,因爲幾乎所有操作系統都把文件系統建模爲樹狀結構,磁盤就是根目錄,文件夾、子文件夾就是分支、子分支,依此類推。

對於Windows的路徑名大家可能比較熟悉:

C:\Windows\Help\Help

當然,對於不同的操作系統路徑名的精確寫法還是有差別的。然而Python提供的函數和常量可完成常見的路徑名操作,而不必關心這些語法上的細節。只要稍加小心,就可以不管底層文件系統是什麼,都能編寫出正常運行的Python程序。

1)絕對路徑和相對路徑

操作系統支持以下兩種路徑表示法:

  • 絕對路徑指明瞭文件在整個文件系統中的確切位置,不會有什麼歧義。絕對路徑將給出文件的完整路徑,從文件系統的根目錄開始。
  • 相對路徑指明瞭文件相對於文件系統某點的位置,該相對點並不是由相對路徑本身給出的。相對路徑起始點的絕對位置,是由調用時的上下文給出的。

相對路徑需要根據上下文來確定實際的位置,上下文一般由兩種方式來給出。

  • 相對簡單的方式是在已有的絕對路徑上添加相對路徑,以生成一個新的絕對路徑;
  • 相對路徑獲得上下文的第二種方式,是通過對當前工作目錄的隱式引用。當前工作目錄是指,在運行Python程序的任意時刻,程序記錄的當前所在目錄。例如,os.listdir(path)命令用了相對路徑作爲參數,則該相對路徑就以當前工作目錄作爲錨點(anchor),結果中文件名所在目錄的路徑就是當前工作目錄加上參數指定的相對路徑。

2)當前工作目錄

每當在計算機上編輯文檔時,都會有一個位置概念,即文檔在計算機文件結構中所處的當前位置。類似地,每當Python運行時,也有一個當前位置地概念,即某時刻所處地目錄結構。這一點很重要,因爲程序可能需要獲取當前目錄中的文件列表。Python程序所在的目錄被稱爲該程序的當前工作目錄,當前工作目錄可能與存放該程序的目錄不同。

可以使用os.getcwd()命令(獲取當前工作目錄)查看Python初始狀態下的當前工作目錄:

>>> import os
>>> os.getcwd()
'D:\\python37'

以上是在windows上面的。注意調用函數os.getcwd()時是不帶參數的,以強調返回值不是固定不變的。如果執行了修改當前工作目錄的命令,其返回結果就會發生變化。當前工作目錄可能是存放Python程序的目錄,也可能是啓動Python時所在的目錄。在Linux系統上,返回結果會是/home/myuser,也就是當前用戶的主目錄(home)。

在windows上,路徑中會有額外的反斜槓插入,因爲Windows系統用“/”作爲路徑分隔符。

下面輸入:

>>> os.listdir(os.curdir)
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__', '列表.py']

屬性os.curdir返回的是系統用來表示當前目錄的字符串。該字符串是個相對路徑,也就是說os.listdir會將其加到當前工作目錄的路徑之後,路徑其實沒有發生變化。上述命令將會返回當前工作目錄中所有文件/文件夾的列表。任選擇一個文件夾名稱,鍵入以下命令:

>>> os.chdir('Lib')     #修改當前目錄
>>> os.getcwd()
'D:\\python37\\Lib'

由上可見,Python會移入os.chdir函數參數指定的文件夾中。這時再次調用os.listdir(os.curdir),將會返回folder文件夾中的文件列表,因爲os.curdir將相對新的當前工作目錄而言。Python中有很多文件操作系統,都是以這種方式使用當前工作目錄的。

 

3)使用pathlib模塊訪問目錄

用pathlib獲取當前目錄的步驟如下:

>>> import pathlib
>>> cur_path = pathlib.Path()
>>> cur_path.cwd()
WindowsPath('D:/python37')

pathlib不提供像os.chdir()那樣改變當前工作目錄的函數,但可以通過創建path對象來新建文件夾。

 

4)路徑名的處理

 

使用os.path處理路徑名

Python提供了處理路徑名的功能,這些功能由os.path子模塊中的一些函數和常量構成,利用這些功能處理路徑名時,就無須顯式採用任何與操作系統相關的語法了。路徑名仍然用字符串來表示,但不用當作字符串來處理了。

可用os.path.join函數在各種操作系統中構建一些路徑名:

>>> import os
>>> print(os.path.join('bin','utils','disktools'))
bin\utils\disktools

os.path.join()函數將參數解釋爲一系列的目錄名或文件名,這些路徑將被拼接起來形成單個字符串,底層操作系統將該字符串理解爲相對路徑。

注意,os.path.join()函數可以由一系列目錄或文件名生成文件路徑,並且不必關心底層操作系統的語法規則。上面代碼是在Windows系統中運行的,結果返回的是反斜槓連接的路徑名。同樣在Linux/UNIX系統中,會採用正斜槓作爲路徑名。如果想讓構建文件路徑的方式不受未來運行環境的限制,那麼採用os.path.join就是基本的方式。

os.path.join的參數不一定非得是單個目錄或文件名,也可以是子路徑,連起來可以形成更長的路徑名。以下例子演示了在Windows環境中的這種用法,並且這時必須在字符串中使用雙反斜槓。注意,這時用正斜槓(/)輸入路徑名也是可以的,因爲Python在與Windows操作系統交互之前會進行轉換:

>>> import os
>>> print(os.path.join('mydir\\bin', 'utils\\disktools\\chkdisk'))
mydir\bin\utils\disktools\chkdisk

當然,如果始終用os.path.join來建立路徑,就幾乎不必操心上述問題。可以寫成可移植的形式:

>>> path1 = os.path.join('mydir', 'bin')
>>> path2 = os.path.join('utils', 'disktools', 'chkdisk')
>>> print(os.path.join(path1, path2))
mydir\bin\utils\disktools\chkdisk

在不同的底層系統中,os.path.join()函數還會對絕對路徑名和相對路徑名做出一定的處理。

Linux/unix中:

  • 絕對路徑始終以/開頭,因爲單個斜槓表示整個系統的頂級目錄,其他所有內容都在其下,包括可用的各種軟盤和CD驅動器。
  • UNIX中的相對路徑是指不以斜槓開頭的合法路徑。

Windows中:

  • 如果路徑名以驅動器字母開頭,後跟冒號和反斜槓,那麼就是絕對路徑,如C:\Program\Files\Doom。注意,如果僅是C:,尾部不帶反斜槓,那麼並不能可靠地表示C:驅動器地頂級目錄。必須用C:\來引用C:驅動器地頂級目錄。這種要求沿用了DOS的傳統,而不是Python的設計規則。
  • 如果路徑名既不以驅動器字母開頭,也不以反斜槓開頭,那麼就是相對路徑,如mydirectory\letters\business。
  • 如果路徑名以\\開頭,後跟服務器名稱,那麼是網絡資源的路徑。
  • 其他路徑都被視爲無效路徑。

無論採用什麼操作系統,os.path.join都不會對生成的路徑名進行完整性檢查。生成的路徑名中可能會包含操作系統禁用的字符,不同的操作系統禁止用於路徑名稱的字符各不相同。如果需要對結果進行檢查,最好的解決方案可能就是自行編寫一個小小的路徑合法性檢查函數。

 

其他常用的路徑名處理函數:

>>> import os

#將路徑名拆分爲文件名(路徑尾部的單個文件或目錄名稱)和其餘部分

>>> print(os.path.split(os.path.join('name', 'directory', 'path')))
('name\\directory', 'path')

#只返回路徑中的文件名

>>> os.path.basename(os.path.join('some', 'directory', 'path.jpg'))
'path.jpg'

#只返回前面的路徑部分

>>> os.path.dirname(os.path.join('some', 'directory', 'path.jpg'))
'some\\directory'

#處理以.標識的文件擴展名

>>> os.path.splitext(os.path.join('some', 'directory', 'path.jpg'))
('some\\directory\\path', '.jpg')

#將環境變量擴展爲完成的路徑

>>> os.path.expandvars('$HOME\\temp')
'C:\\Users\\administrator\\temp'

 

用pathlib處理路徑名

這裏用到了Path對象的方法。

>>> from pathlib import Path
>>> cur_path = Path()
>>> print(cur_path.joinpath('bin', 'utils', 'disktools'))
bin\utils\disktools

直接用“/”操作符也可以達到同樣效果:

>>> cur_path / 'bin' / 'utils' / 'disktools'
WindowsPath('bin/utils/disktools')

Path對象的常用屬性:

#Path對象的parts屬性將會返回一個元組,元素就是路徑的各個組成部分

>>> a_path = Path('bin/utils/disktools')
>>> print(a_path.parts)
('bin', 'utils', 'disktools')

#Path對象的name屬性將只返回路徑的文件名部分

>>> a_path = Path('some', 'directory', 'path.jpg')
>>> a_path.name
'path.jpg'

#parent屬性將返回除文件名外的部分

>>> print(a_path.parent)
some\directory

# Path對象的suffix屬性將返回帶.的擴展名部分

>>> a_path.suffix
'.jpg'

Path對象還擁有其他一些方法,可靈活地對路徑名和文件進行處理,請參考官方文檔。

 

(二)獲取文件信息

文件路徑應該用來表示硬盤中的實際文件和目錄。因爲需要了解路徑指向的文件信息,所以路徑對象還有可能被傳來傳去。Python爲獲取文件信息提供了很多函數。

  • os.path.exists():接收一個路徑參數,如果參數是文件系統中存在的路徑,則返回True,否則返回False。
>>> os.path.exists('C:\Huawei Share')
True
  • os.path.isfile():接收一個路徑參數,當且僅當接收的路徑表示某種類型的普通數據文件(包括可執行文件)時,函數返回True,否則返回False(包括參數指向的不是文件系統中的內容)
>>> os.path.isfile('file:///C:/Users/administrator/Desktop/機械製造基礎/ch01.pdf')
False
>>> os.path.isfile('D:\Z\文件夾\序號.docx')
True
  • os.path.isdir():接收一個路徑參數,當且僅當參數表示的是目錄時,函數返回True,否則返回False。
>>> os.path.isdir('file:///C:/Users/administrator/Desktop/機械製造基礎/ch01.pdf')
False
>>> os.path.isdir('D:\Z')
True
  • os.scandir():獲取整個目錄下文件的更爲完整的信息,os.scandir將返回os.DirEntry迭代器對象。os.DirEntry對象能夠展示目錄中每一項的文件屬性,因此用os.scandir將會比組合使用os.listdir與os.path操作更加快速有效。
  • 例如,要知道某個目錄項引用的是文件還是目錄,os.scandir的功能就有用得多,能夠獲取到更多的目錄信息。os.DirEntry對象具備的方法,很多都與上面提到的os.path函數相對應,包括exists、is_dir、is_file、is_socket和is_symlink。
  • os.scandir還支持由with提供的上下文管理器,爲了確保資源的妥善釋放,推薦使用這個。以下示例將遍歷目錄中的所有條目,打印出條目的名稱以及是否爲文件:
>>> with os.scandir(".") as my_dir:
	for every in my_dir:
		print(every.name, every.is_file())

		
as.py True
assert.py True
circle.py True
circle__cm.py True
conclusion.py True
DLLs False
Doc False
include False
Lib False
libs False
LICENSE.txt True
NEWS.txt True
pymysql False
python.exe True
python3.dll True
python37.dll True
pythonw.exe True
qwes.py True
Scripts False
tcl False
Tools False
vcruntime140.dll True
__pycache__ False
列表.py True

 

(三)文件系統的其他操作

除了獲取文件相關信息之外,Python還支持某些對文件系統的直接操作,這時通過os模塊中的一些基礎而有用的函數來完成的。

  • 在glob模塊中有個glob函數,能夠擴展路徑名中的通配符和字符序列,返回當前工作目錄中匹配的文件。“*”將匹配任意字符序列,“?”將匹配任意單個字符:
>>> glob.glob("*")
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__', '列表.py']
>>> glob.glob("NEWS.t?t")
['NEWS.txt']
  • os.rename可以重命名(移動)文件或目錄,os.rename不僅可以在目錄內移動(重命名)文件,還可以子啊目錄之間移動文件:
>>> os.rename('列表.py','列表liebiao.py')
>>> os.listdir(os.curdir)
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__', '列表liebiao.py']
  • os.remove可以刪除文件,注意不能用os.remove刪除目錄。這時一種安全限制,確保不會因爲誤操作將整個目錄都刪除了:
>>> os.remove('列表liebiao.py')
>>> os.listdir(os.curdir)
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__']
  • 如果要創建目錄,可以使用os.makedirs或os.mkdir,這兩個區別是,os.makedirs會連同必要的中間目錄一起創建,但os.mkdir不會:
>>> os.makedirs('mydir')
>>> os.listdir(os.curdir)
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mydir', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__']
>>> os.path.isdir('mydir')
True
  • 使用os.rmdir刪除空目錄,如果視圖刪除非空目錄,則會引發異常:
>>> os.rmdir('mydir')
>>> os.listdir(os.curdir)
['as.py', 'assert.py', 'circle.py', 'circle__cm.py', 'conclusion.py', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pymysql', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qwes.py', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', '__pycache__']

如果要刪除非空目錄,可以使用shutil.rmtree。

 

設計一個計算文件大小的程序

這裏通過os模塊的一些函數,讀取文件目錄或者是文件的大小,並且進行輸出。

import os

# 自定義統計目錄大小函數
def stat_dir_size(dir_path):

    total = 0

    if os.path.isdir(dir_path):
        dlist = os.listdir(dir_path)
        for f in dlist:
            subdir = os.path.join(dir_path, f)
            if os.path.isfile(subdir):
                total = total + os.path.getsize(subdir)
            if os.path.isdir(subdir):
                total = total + stat_dir_size(subdir)
        return total

    elif os.path.isfile(dir_path):
        return os.path.getsize(dir_path)
    else:
        return -1
    
# 測試
path = input("請輸入目錄:")
size = stat_dir_size(path)
if size == -1:
    print("(Error) \"{}\" is not a directory.".format(path))
else:
    print("目錄大小:", size, "Bytes")

 

(四)file對象

Python處處皆對象,文件也是Python的對象。

 

1)打開和關閉文件

python使用open()函數打開文件。

  • open不會讀取文件中的內容,而是返回一個file對象,可用於訪問被打開的文件。
  • file對象會對文件及讀寫位置進行跟蹤記錄。
  • open的第一個參數是路徑名,第二個參數是表示文件打開方式的字符串。‘r’表示以只讀模式打開文件;‘w’表示以寫入模式打開文件,文件中已有的數據將被全部清除;‘a’表示以追加模式打開文件,新數據將被追加到文件已有數據的尾部。如果打開文件只是爲了讀取數據,第二個參數可以省略,其默認值就是‘r’。
  • open還有第三個可選參數,定義了文件讀寫緩衝模式。緩衝(buffering)是將數據暫時保存在內存中,直到需要讀取或寫入數據足夠多,值得花費一次磁盤訪問的時間時,再去執行真正的磁盤讀寫。
  • open方法還有其他參數,其中encoding控制着文本文件的編碼格式,以及文本文件的換行符處理方式。

 

>>> file_open = open('README.txt','r')
>>> while True:
	print(file_open.readline())

	
Traceback (most recent call last):
  File "<pyshell#3>", line 2, in <module>
    print(file_open.readline())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 39: illegal multibyte sequence

以上代碼運行之後會報錯,這是一種常見的編碼解碼錯誤的問題,解決方案如下:

(0)將‘gbk’換成‘utf-8’也適用。 
(1)、首先在打開文本的時候,設置其編碼格式,如:open(‘1.txt’,encoding=’gbk’); 
(2)、若(1)不能解決,可能是文本中出現的一些特殊符號超出了gbk的編碼範圍,可以選擇編碼範圍更廣的‘gb18030’,如:open(‘1.txt’,encoding=’gb18030’); 
(3)、若(2)仍不能解決,說明文中出現了連‘gb18030’也無法編碼的字符,可以使用‘ignore’屬性進行忽略,如:open(‘1.txt’,encoding=’gb18030’,errors=‘ignore’); 
(4)、還有一種常見解決方法爲open(‘1.txt’).read().decode(‘gb18030’,’ignore’)

 

當我們將代碼修改之後:

>>> file_open = open('README.txt','r',encoding = 'utf-8')
>>> while True:
	print(file_open.readline())

	
# Python_Learning


我們會發現,現在README.txt中的文本可以讀取出來了,但是新的問題又來了,就是我們這個while將會一直循環下去,因爲這裏的readline()函數

  • 第一次調用readline函數將返回file對象的第一行,包括第一個換行符在內。如果文件中不包含換行符,則返回整個文件的內容;
  • 下一次調用readline函數將返回file對象的第二行(如果存在),依此類推。
  • 當file對象中沒有數據可讀了,將會返回空的字符串。

上面代碼之所以會出現死循環,就是應爲readline函數返回的空字符串一直被打印。解決辦法也很簡單:

>>> file_open = open('README.txt','r',encoding = 'utf-8')
>>> while file_open.readline() != "":
	print(file_open.readline())

這裏爲循環設置一個推出條件:當readline函數返回空的字符串時就退出。

 

對file對象讀寫完畢後,應該將其關閉。關閉file對象會釋放系統資源,並允許該文件能被其他代碼讀寫,通常能提高程序的可靠性。對於小型腳本程序而言,不關閉文件對象通常不會造成太大的影響。在腳本或程序運行結束時,文件對象將會被自動關閉,對於大型程序來說,打開的文件對象太多,可能會耗盡系統資源,導致程序異常終止。

當文件對象使用完畢後,可以用close方法來關閉它:

>>> file_open = open('README.txt','r',encoding = 'utf-8')
>>> print(file_open.readline())
Python_Learning

>>> file_open.readline() != ""
True
>>> file_open.close()

 

 

2)使用with關鍵字

對於打開之後需要關閉的情況,python提供了with關鍵字,可以實現自動關閉文件:

>>> file_open = open('README.txt','r',encoding = 'utf-8')
>>> with open('README.txt','r',encoding = 'utf-8') as file_open:
	while file_open.readline() != "":
		print(file_open.readline())

		
# 以下爲README.txt中的內容:

本項目包含 Python 的相關練習和作業代碼

以周(week)爲目錄進行編排,具體如下:

對於以上代碼中的README.txt文件,存在於我的Python目錄下面,所以直接輸入文件名字就可以訪問了。當然輸入其他的文件的路徑名也是可以進行訪問的。

在Spyder中打開文件:

with open('D:\python37\NEWS.txt', 'r') as file_object:
    line = file_object.readline()

這裏會報錯如下:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 11-12: malformed \N character escape

這是由於路徑名中的反斜槓也代表着轉義字符,window 讀取文件可以用\,但是在字符串中\是被當作轉義字符來使用,經過轉義之後可能就找不到路徑的資源了,例如\t會轉義爲tab鍵。

總結有三種解決方法:

一:更換爲絕對路徑的寫法
func1("C:\\Users\\renyc")

二:顯式聲明字符串不用轉義(加r)
func1(r"C:\Users\renyc")

三:使用Linux的路徑/
func1("C:/Users/renyc")

修改後可以正常運行:

with open(r'D:\python37\NEWS.txt', 'r',encoding = 'utf-8') as file_object:
    #line = file_object.readline()
    while file_object.readline() != "":
        print(file_object.readline())

 

3)讀寫文本函數

最常用的文本文件讀取函數就是readline,上面已經介紹過了。用這個函數可以讀取文本文件,還可以用來計算出來文件中的文本行數:

with open(r'D:\python37\filetext.txt','r') as file_object:
    
    #line = file_object.readline()
    while file_object.readline() != "":
        count += 1
        print(file_object.readline())
        
    print(count)

注意:以上涉及到open函數打開文件時,對應的目錄下面給都需要由相應的文件,否則會報FileNotFoundError錯誤。

readlines函數

具體到以上問題,更簡短的設計方案是用內置的readlines方法。readlines將讀取文件中的所有行,並作爲字符串列表返回,每行就是一個字符串,尾部的換行符仍然保留:

with open(r'D:\python37\filetext.txt','r') as file_object:
    file_list = file_object.readlines()
    print(file_list)
    print(len(file_list))

輸出:

['hello python\n', 'hello world\n', 'hello China']
3

當然,如果要對一個大型文件統計行數,readlines方法可能會導致計算機內存不足,因爲它會一次性將整個文件讀入內存。如果要從大型文件中讀取一行,偏偏該文件中不含換行符,那麼用了readline也可能導致內存溢出,當然這種情況不大可能發生。爲了應對這種情況,readline和readlines都可帶一個可選參數,可以控制每次讀取的數據量。詳細信息可以看看官方文檔。

將file對象視爲迭代器

另一種遍歷文件全部數據行的方法,是將file對象視爲for循環中的迭代器:

file_object = open(r'D:\python37\filetext.txt','r')
count = 0
for line in file_object:
    count += 1
print(count)
file_object.close()

迭代器方式具備一個優點,每行數據都是按需讀入內存的。因此即便是面對大型文件,也不用擔心內存不足的問題。另外,迭代器方式還具有更簡單、可讀性更好的優點。

寫入文件

與readline和readlines方法相對應的寫入方法是write和writelines。注意,不存在writeline方法。

write方法將寫入一個字符串,如果字符串中包含了換行符,則可以一次寫入多行。

file_object = open(r'D:\python37\filetext.txt','a')
file_object.write('Hello nefu\n')
file_object.close()
with open(r'D:\python37\filetext.txt','r') as file_object:
    file_list = file_object.readlines()
    print(file_list)
    print(len(file_list))

輸出:

['hello python\n', 'hello world\n', 'hello ChinaHello nefuHello nefuHello nefuHello nefu\n', 'Hello nefu\n', 'Hello nefu\n']
5

記住,要在寫入文件之後關閉文件,再在只讀模式下用readlines讀取文本。如果直接讀取會報UnsupportedOperation錯誤。

雖然這裏顯示出來了後面的\n換行符,但是世界打開這個文件的時候是這樣的;

 

 

(五)文件操作的其他模塊

Python文件操作除了上面提道德os模塊以外,Python還提供了其他模塊。在不同的場合下,它們工作的效率也不同,這裏也只是簡單介紹一下,等我們真正去調試一個項目代碼的時候,就會有更深切的體會了。

還有pathlib、struct、pickle、shelve等可以去用。它們的效率、安全性也不同,這裏先介紹這些。

剩下的還要我們慢慢去了解。

 

 

 

參考:

  1. https://blog.csdn.net/shijing_0214/article/details/51971734
  2. https://www.cnblogs.com/xiugeng/p/8635862.html
  3. https://www.cnblogs.com/rychh/p/9743864.html

 

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