天天看點

Python3--檔案讀取、寫入、追加及seek()方法的使用

Python3--檔案讀取、寫入、追加及seek()方法的使用

一、讀取、寫入、追加

在讀取、寫入、追加資料之前,我們先導入os子產品(我們對檔案系統的通路大多通過os子產品實作)再将我們要使用的絕對路徑指派給變量file_name、file_name2、file_name3.

# -*- coding: utf-8 -*-
"""
Created on Wed Aug  9 17:11:06 2017

@author: goat

how to read\write file
"""
import os

base_dir = os.getcwd()
#擷取目前檔案夾的絕對路徑
file_name = os.path.join(base_dir, 'data', 'my_infor.txt')
#拼接目前目錄和data檔案夾和my_infor.txt檔案
file_name2 = os.path.join(base_dir, 'data', 'my_write.txt')
file_name3 = os.path.join(base_dir, 'data', 'my_test.txt')      

1.使用readlines()方法讀取所有剩餘行

my_open = open(file_name, 'r')
# 若檔案不存在,報錯,若存在,讀取
my_infor = my_open.readlines()
#readlines()方法讀取所有剩餘行,将他們作為一個字元串清單傳回
my_open.close()
#close()關閉檔案,結束通路
print(my_infor)      

#===========================================

輸出結果如下:

['安徽财經大學\n', '應用統計\n', '大三\n', '19歲\n']

#===========================================

2.使用檔案疊代器每次讀取和顯示一行

my_open = open(file_name, 'r')
# 若檔案不存在,報錯,若存在,讀取
for eachline in my_open:
    print(eachline.strip())
#使用文本疊代器,每次讀取和顯示一行
#使用strip(rm)方法移除字元串頭尾指定的字元
#rm為需要删除的字元
#當rm為空時,預設删除空白符(包括'\n', '\r',  '\t',  ' ')
my_open.close()      

#===========================================

輸出結果如下:

安徽财經大學

應用統計

大三

19歲

#===========================================

3.寫入資料

my_open = open(file_name2, 'w')
#打開fie_name2路徑下的my_write.txt檔案,采用寫入模式
#若檔案不存在,建立,若存在,清空并寫入
my_open.write('one\ntwo\n')
#在檔案中寫入一個字元串
my_open.write('three\n')
my_open.close()

##檢查是否正确寫入
my_open = open(file_name2, 'r')
#讀取file_name2路徑下的my_write.txt檔案
my_infor = my_open.readlines()
my_open.close()
print(my_infor)      

#===========================================

輸出結果如下:

['one\n', 'two\n', 'three\n']

#===========================================

4.追加資料

my_open = open(file_name, 'a')
#打開fie_name路徑下的my_infor.txt檔案,采用追加模式
#若檔案不存在,建立,若存在,追加
my_open.write('蚌埠\n')
my_open.close()

##檢查是否正确追加
my_open = open(file_name, 'r')
#讀取file_name路徑下的my_write.txt檔案
my_infor = my_open.readlines()
my_open.close()
print(my_infor)      

#===========================================

輸出結果如下:

['安徽财經大學\n', '應用統計\n', '大三\n', '19歲\n', '蚌埠\n']

#===========================================

二、seek()方法使用

seek()方法使用案例

my_open = open(file_name3, 'w+')
#打開fie_name3路徑下的my_test.txt檔案,以讀寫方式
#若檔案不存在,建立,若存在,覆寫
#實際上我們的确沒有這個檔案
print('position_1 : ', my_open.tell())
#傳回目前在檔案中的位置
my_open.write('line_1\n')
print('position_2 : ', my_open.tell())
my_open.write('line_2\n')
print('position_3 : ', my_open.tell())

try:
    my_open.seek(-len('line_2\n'), 1)
    '''seek()可以在檔案中移動檔案指針指針
    從whence(0 代表檔案開始 1 代表目前位置 2 代表檔案末尾)偏移off位元組
    off為正往結束方向移動,為負往開始方向移動
    這裡表示從目前位置往開始方向移動8位元組'''
    print('position_4 : ', my_open.tell())
    read1 = my_open.readline()
    #從檔案中讀取并傳回一行
    print(read1, '\nposition_5 : ', my_open.tell())
    my_open.seek(off = 0, whence = 0)
    #回到最開始
    read2 = my_open.readline()
    print(read2, '\nposition_6 : ', my_open.tell())
except IOError as e:
    print(e,'\n', 
    '意為:對于非二進制的文本檔案,不允許使用偏移定位。')
    print('position_4 : ', my_open.tell())

my_open.close()      

#===========================================

輸出結果如下:

position_1 :  0

position_2 :  8

position_3 :  16

can't do nonzero cur-relative seeks

 意為:對于非二進制的文本檔案,不允許使用偏移定位。

position_4 :  16

#===========================================

為了解決這種情況,我們建立一個二進制檔案

my_open = open(file_name3, 'wb+')
#讀寫打開或建立一個二進制檔案,允許讀和寫
print('position_1 : ', my_open.tell())

try:
    my_open.write('line_1\n')
    print('position_2 : ', my_open.tell())
    my_open.write('line_2\n')
    print('position_3 : ', my_open.tell())
    my_open.seek(-len('line_2\n'), 1)
    print('position_4 : ', my_open.tell())
    read1 = my_open.readline()
    print(read1, '\nposition_5 : ', my_open.tell())
    my_open.seek(off = 0, whence = 0)
    read2 = my_open.readline()
    print(read2, '\nposition_6 : ', my_open.tell())
except TypeError as e:
    print(e, '\n',
          '意為:需要的是一個位元組的對象,不是“str”')
my_open.close()      

#===========================================

輸出結果如下:

position_1 :  0

a bytes-like object is required, not 'str'

 意為:需要的是一個位元組的對象,不是“str”

#===========================================

Python檔案使用“wb+”方式打開,寫入字元串會報錯,因為這種打開方式為:以二進制格式打開一個檔案隻用于寫入。

如果該檔案已存在則将其覆寫。如果該檔案不存在,建立新檔案。是以寫入的字元類型需為二進制格式,如:

f.write("hello".encode('ascii'))

寫入的編碼範圍不為128以内,就不能使用ascii了

如:

fh.write("漢字".encode('UTF-8'))

my_open = open(file_name3, 'wb+')
print('position_1 : ', my_open.tell())
my_open.write('line_1\n'.encode('ascii'))
print('position_2 : ', my_open.tell())
my_open.write('line_2\n'.encode('ascii'))
print('position_3 : ', my_open.tell())
my_open.seek(-len('line_2\n'), 1)
print('position_4 : ', my_open.tell())
read1 = my_open.readline()
print(read1, '\nposition_5 : ', my_open.tell())
my_open.seek(0, 0)
read2 = my_open.readline()
print(read2, '\nposition_6 : ', my_open.tell())
my_open.close()
##檢查是否正确寫入
my_open = open(file_name3, 'r')
#讀取file_name3路徑下的my_test.txt檔案
my_infor = my_open.readlines()
my_open.close()
print(my_infor)      

#===========================================

輸出結果如下:

position_1 :  0

position_2 :  7

position_3 :  14

position_4 :  7

b'line_2\n'

position_5 :  14

b'line_1\n'

position_6 :  7

##檢查是否正确寫入

['line_1\n','line_2\n']

#===========================================

終于可以使用seek()方法了,現在我們打開my_test.txt,檢視輸出結果,如下圖所示:

Python3--檔案讀取、寫入、追加及seek()方法的使用

發現檔案裡并沒有換行,這是因為:文本模式下打開檔案寫入時,換行用\n即可以了。在使用二進制模式打開檔案,寫入的時候,換行請使用\r\n 

my_open = open(file_name3, 'wb+')
print('position_1 : ', my_open.tell())
my_open.write('line_1\r\n'.encode('ascii'))
print('position_2 : ', my_open.tell())
my_open.write('line_2\r\n'.encode('ascii'))
print('position_3 : ', my_open.tell())
my_open.seek(-len('line_2\r\n'), 1)
print('position_4 : ', my_open.tell())
read1 = my_open.readline()
print(read1, '\nposition_5 : ', my_open.tell())
my_open.seek(0, 0)
read2 = my_open.readline()
print(read2, '\nposition_6 : ', my_open.tell())
my_open.close()

##檢查是否正确寫入
my_open = open(file_name3, 'r')
#讀取file_name3路徑下的my_test.txt檔案
my_infor = my_open.readlines()
my_open.close()
print(my_infor)      

#===========================================

輸出結果如下:

position_1 :  0

position_2 :  8

position_3 :  16

position_4 :  8

b'line_2\r\n'

position_5 :  16

b'line_1\r\n'

position_6 :  8

##檢查是否正确寫入

['line_1\n','line_2\n']

#===========================================

打開my_test.txt,如下圖所示:

Python3--檔案讀取、寫入、追加及seek()方法的使用

好了,累死寶寶了,表示自己原理什麼的完全不懂,如有錯誤請求提出!

參考文獻:

檔案使用二進制模式打開情況下的換行的方法

Python檔案使用“wb”方式打開,寫入内容

fopen與讀寫的辨別r,r+,rb+,rt+,w+.....

python檔案打開方式詳解——a、a+、r+、w+差別

使用​​os​​​子產品來擷取目前檔案的​​絕對路徑​​和拼接路徑

​​https://zhidao.baidu.com/question/360101661090517412.html?qbl=relate_question_1&word=python%CF%E0%B6%D4%C2%B7%BE%B6%CF%C2%D2%BB%BC%B6​​