天天看點

c/c++讀取txt檔案中指定行的内容_Python中如何對檔案進行操作

python中對于檔案有讀和寫操作。

打開檔案

# 現建立一個hello.txt檔案,然後加入内容hello world
f = open(file='./hello.txt')
result = f.read()
print(result )  #輸出: hello world
f.close()
           
  • 打開檔案會用到open()函數,文法為:open(name[,mode[,buffering]]);
  • open函數()的檔案名是必須的,而模式和緩沖參數都是可選的;
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
           
  • buffering :是指緩沖大小,-1表示預設大小4096,0表示關閉緩沖區, encoding表示編碼方式,None表示預設的編碼方式;
  • errors :表示編碼錯誤被捕獲,如果是errors=ignore,那麼出現編碼錯誤将會被忽略;
  • newline :表示檔案換行的意思;
  • closefd :表示是否關閉檔案時同時關閉檔案描述符;

mode模式參數常用值

  • 'r'

    :隻讀;
  • 'w'

    :隻寫,從開頭開始寫,是以會覆寫檔案的内容;
  • 'a'

    :追加,不會覆寫檔案内容;
  • 'x'

    :隻寫,如果檔案不存在則建立檔案,以隻寫方式打開檔案,保護寫;
  • 'b'

    :二進制;
  • 't'

    :文本,是預設的模式,可以不寫,一般都是以文本模式打開檔案;
  • '+'

    :讀寫;
  • 'r+'

    :給隻讀賦予寫的能力;
  • 'w+'

    :給隻寫賦予隻讀的能力,因為是以隻寫的形式打開檔案,會清空檔案内容,是以不能讀取到内容,隻是有了讀的功能;

檔案讀取

f = open(file='./hello.txt',mode='w')
result = f.read()
print(result) # hello world

f.write('a')  # 如果寫入則會報錯,因為此時是隻讀模式
#
result1 = f.read(3)  # 表示檔案讀三個位元組,不給值表示直接讀到EOF
print(result1) # hel

f.close() # 讀取完檔案一定要關閉
           
  • 讀取檔案會用到read()函數,用于從檔案中讀取指定的字元數,如果未給定或為負值則表示讀取所有字元;
  • 如果檔案非常大,尤其是大于記憶體時,無法使用read()方法;

檔案寫入

  • w

    x

    a

    都是隻寫,

    t

    模式是字元流,按照字元編碼了解,

    b

    是位元組流,位元組操作是bytes類型;
  • +

    無法單獨使用,用來增強

    r

    w

    x

    a

    等功能,但是在擷取檔案對象是依然是本身的特性;
# w為隻寫模式
f = open(file='./hello.txt', mode='w')
f.write('a')
f.read() # 此時讀就會報錯
f.close()

# x是隻寫,檔案不存在,建立檔案,以隻寫方式打開
f = open('./test.txt', 'x')
# f.read() # 此時讀會報錯
f.write('a')
f.close()

# a隻寫,檔案存在,追加内容,檔案不存在,隻寫,追加内容
f = open('./test1.txt', 'a')
# f.read() # 此時讀會報錯
f.write('aaa')
f.close()
           

檔案指針

f = open('hello.txt', 'r+')
print(f.tell()) # 檔案的起始位置 0
print(f.read()) # 讀檔案所有的内容
print(f.tell()) # EOF,也就是最後一個字元是幾
print(f.seek(3)) # 偏移兩個位元組
print(f.read())
f.close()

f = open('test.txt', 'rb+')
print(f.tell()) # 檔案的起始位置0
print(f.read()) # 讀檔案所有的内容
print(f.tell()) # EOF,也就是最後一個字元
print(f.seek(2)) # 偏移兩個位元組
print(f.read())

f.write(b'ni hao')
f.seek(2,2) # 二級制模式下,seek(offset, whence=0) 可以給whence傳遞1, 2 或 0, 0表示檔案從頭開始, 1表示從目前位置開始,2表示從檔案末尾EOF開始
f.seek(1,1)
f.write(b'ni hao')
f.flush() # 将緩存重新整理到檔案
f.write(b'ni hao')
f.close() # 檔案句柄關閉的時候,會将緩存重新整理到檔案
           
  • mode為

    r

    的時候,指針的起始點在0;
  • mode為

    a

    的時候,指針的起始點在EOF,檔案末尾;
  • tell()函數 :顯示指針的目前位置;
  • seek()函數 :移動檔案指針的位置,參數offset指的是偏移的位元組;
  • flush()函數 :将緩存重新整理到檔案;
  • close()函數 :關閉檔案;

檔案行讀取

import io
f = open('hello.txt', 'r+')
print(io.DEFAULT_BUFFER_SIZE) # 8192
print(f.readline(), '第一行')  # 讀取一行
print(f.readline(), '第二行')
print(f.readlines())          # 讀取所有行,且傳回清單
           
  • readline() 函數 用于從檔案讀取整行(包括 "n" 字元),如果指定了一個非負數的參數,則傳回指定大小的位元組數(包括 "n" 字元);
  • readlines() 函數 用于讀取所有行,且傳回值為清單形式;

檔案上下文管理器

使用with 關鍵字可以實作上下文管理器,通過上下文管理的方式打開檔案,在檔案末尾會自動執行關閉語句,不需要寫f.close()來關閉檔案了。

示例:
with open('test.txt',mode='w') as f:
    f.write('加油!')