1. 程式人生 > >第10課 檔案的讀寫

第10課 檔案的讀寫

一、檔案的讀寫

1、檔案的開啟,注意事項

1)路徑要正確

2)格式要帶全(.txt)

filedir = D:\software\HelloWorld\songqin\python\lesson11 檔案的讀寫/test1.txt'  # /的好處是避免出現轉義字元
filedir1 = 'd:\software\HelloWorld\songqin/lesson11 檔案的讀寫\\test2.txt'  # \的壞處是會出現轉義字元,如\t,可以用\\對\進行轉義
filedir2 = r 'd:\software\HelloWorld\songqin/lesson11 檔案的讀寫\\test3.txt'  # 使用
r,可以避免出現\t的情況

fo = open(filedir)

# 執行結果
---檔案操作---

3)讀模式的r可以預設

fileDir = 'D:\software\HelloWorld\songqin\python\lesson11 檔案的讀寫/test1.txt'

fo = open(fileDir, 'r')  # r可預設
print(fo)

#  執行結果
---檔案操作---
<_io.TextIOWrapper name='D:\\software\\HelloWorld\\songqin\\python\\lesson11 檔案的讀寫/test1.txt' mode='r' encoding='cp936'>

2、絕對路徑:帶碟符---如,C、G

3、相對路徑:

1)當前目錄: ./

2)上一層目錄:..      ../

4、tell()方法:獲取檔案指標位置

fo = open(fileDir, 'r')
print(fo.tell())

# 執行結果
---檔案操作---
0

5、fo.read(數量):讀檔案

fo = open(fileDir, 'r')
print(fo.tell())  # 檔案指標初始位置
fo.read(2)       # 讀取兩個字元
print(fo.tell())  # 檔案指標當前位置

# 執行結果
---檔案操作---
0
2

1)返回的型別是--str

fo = open(fileDir, 'r')
str1 = fo.read(2)
print(type(str1))

# 執行結果
---檔案操作---
<class 'str'>

2)fo.read()---讀取所有

fo = open(fileDir, 'r')
str1 = fo.read()  # 讀取全部內容
print(fo.tell())  # 獲取檔案指標位置
print(str1)  # 列印讀取到的內容


# 執行結果
---檔案操作---
14
123456
abcdef
>>> fo = open('test1.txt')
>>> fo.read()
'123456\nabcdef'

6、檔案內部的換行符是2個字元長度(windows)--舉例,如上面的\n

7、fo.close():關閉檔案

8、fo.seek(長度):移動檔案指標位置

1)移動到檔案初始位置:fo.seek(0)---0 模式,從頭(0)開始。0為絕對位置,如果當前位置為2,那麼要移動到3的位置,則為seek(3),而不是seek(1)。

fo = open(fileDir, 'r')
print('移動前', fo.tell())
fo.seek(2)  # 移動位置
print('移動後', fo.tell())

# 執行結果
---檔案操作---
移動前 0
移動後 2
fo = open(fileDir, 'r')
print('移動前', fo.tell())
fo.seek(2)
print('移動後', fo.tell())
fo.seek(0)     # seek(0), 又回到初始位置
print('再次移動後', fo.tell())  


# 執行結果
---檔案操作---
移動前 0
移動後 2
再次移動後 0

2)1模式---從當前位置開始算---一定要是'br'

fo = open(fileDir, 'br') # 1模式,必須用'br'
fo.seek(2, 1)
print('移動後', fo.tell())
fo.seek(3, 1)
print('再次移動後', fo.tell())

# 執行結果
---檔案操作---
移動後 2
再次移動後 5

3)2模式:從尾部位置開始算---一定要是'br'。如果從尾部往前移,則要用負數。

fo = open(fileDir, 'br')
print('移動前', fo.tell())
fo.seek(1, 2)
print('移動後', fo.tell())
fo.seek(-3, 2)
print('再次移動後', fo.tell())


# 執行結果
---檔案操作---
移動前 0
移動後 15
再次移動後 11

4)seek(長度, 模式)

9、讀一行:fo.readline()---str

fo = open(fileDir, 'r')
str1 = fo.readline()
print(str1)
print(fo.readline()) # 讀取下一行
# 執行結果
---檔案操作---
123456
abcedf

10、讀取所有行:fo.readlines()----返回結果是列表

fo = open(fileDir, 'r')
print(fo.readlines())

# 返回結果
---檔案操作---
['123456\n', 'abcdef']
fo = open(fileDir, 'r')
# print(fo.readlines())
print(fo.readlines()[0]) # 獲取結果列表的元素


# 執行結果
---檔案操作---
123456

1)舉例:提取文件中的編號

# 提取文件中的編號
11:12:11> 001 enter chatroom, level 2
11:12:13> 003 enter chatroom, level 25
fileDir = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test.txt'
fo = open(fileDir, 'r')
#print(fo.readlines())   # 這一句沒注掉,結果一直顯示為列表。因為先執行這一句的話,檔案指標已經在最後一行的末尾。下面的語句讀取不到資料
for str1 in fo.readlines():
    print(str1.split(' ')[1])


# 執行結果
001
003

11、fo.read().splitlines()---獲取所有行的同時----去掉所有 \n

fileDir = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test.txt'


# fo.read().splitlines()----獲取所有行的同時---去掉所有\n
fo = open(fileDir, 'r')
print(fo.read().splitlines())


# 執行結果
['11:12:11> 001 enter chatroom, level 2', '11:12:13> 003 enter chatroom, level 25'

12、寫模式:w

1)如果該檔案存在,則所有內容被清空。

fileDir1 = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\test1.txt'
fo = open(fileDir1, 'w')

2)如果該檔案不存在,則建立該檔案。

 

fileDir1 = 'D:\work\HelloWorld\songqin\python\lesson11 檔案的讀寫\\pytest.txt'
fo = open(fileDir1, 'w')

3)fo.write('123456')---只是儲存在記憶體中

4)fo.flush() / fo.close()---從記憶體寫到磁碟

fo = open(fileDir, 'w')
fo.write('Hello Python')  # pycharm 裡面這一步自動把內容儲存在硬碟上,如果是idle則會先儲存在記憶體中
fo.close()   # 或者fo.flush(),執行這一句,idle才會把資料存在硬碟上


# 執行結果
---檔案操作---

5)寫入的內容換行用---\n

fo = open(fileDir, 'w')
fo.write('123456\nabcdef')

# 執行結果
---檔案操作---

6)print(fo.write('Hello Python')) ----結果有返回值

fo = open(fileDir, 'w')
print(fo.write('Hello Python'))


# 執行結果
---檔案操作---
12

13、a--追加模式--接著已有的內容寫

fo = open(fileDir, 'a')   # 目前test1裡面已有的內容--Hello Python
print(fo.write('123456\nabcdef'))
fo.close()

# 執行結果
---檔案操作---
13

14、讀寫開啟方式

1)r+:為了讀取並且寫檔案而開啟檔案。如果檔案不存在會報錯,檔案指標在檔案的開始位置。

2)w+:為了讀取並寫檔案而開啟檔案。如果檔案不存在,會建立一個檔案。檔案指標在檔案的開始位置。如果檔案已經存在,其內容將被清空。

3)a+:為了讀取並寫檔案而開啟檔案。如果檔案不存在則建立一個檔案。檔案指標在檔案的結尾,很多OS上寫操作永遠在檔案結尾進行,不管是否用了seek()。所以為了保證內容不被清空,建議最好用a+。

fo = open(fileDir, 'a+')
print(fo.write('\nHello Python'))
fo.close()

# 執行結果
---檔案操作---
12

15、with open(fileDir) as fo ===== fo = open(fileDir, 'r'),with open()的優勢

1)可以操作多個檔案

2)會自動執行fo.close()

with open(fileDir, 'r') as rFile, open(fileDir1, 'w') as wFile:  #句尾加英文冒號
    priint()