零基礎小白python入門——深刻Python中的文件操做

任何語言都離不開對文件的操做,那麼Python語言是如何來操做和管理文件的。python

編碼方式

編碼方式的歷史大體爲ASCII ->gb2312->unicode->utf-8,期間具體詳細信息能夠百度linux

來個編碼解碼的小例子先,記住中文能夠進行GBK和utf-8編碼,在GBk一箇中文字符對應兩個字節,在utf-8一箇中文字符對應三個字節,中文不能進行ASCII編碼。git

>>> '阿喵'.encode('GBK')
b'\xc1\xf5\xc8\xf3\xc9\xad'
>>> '阿喵'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
>>> '阿喵'.encode('ascii')
b'阿喵'
>>> "阿喵".encode('utf-8')
b'\xe5\x88\x98\xe6\xb6\xa6\xe6\xa3\xae'
>>> '阿喵'.encode('GBK').decode('GBK')
'阿喵'
>>> '阿喵'.encode('GBK').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte
複製代碼

若是你們在學習中遇到困難,想找一個python學習交流環境,能夠加入咱們的python圈,裙號947618024,可領取python學習資料,會節約不少時間,減小不少遇到的難題。程序員

若是編碼解碼格式不一致可能會出現亂碼,encode表示編碼,decode表示解碼。編程

文件操做的API

下面是Python文件操做的具體的API。windows

方法 含義 open 打開 read 讀取 write 寫入 close 關閉 readline 單行讀取 readlines 多行讀取 seek 文件指針操做 tell 讀取當前指針位置網絡

打開文件

Python的open()函數打開一個文件時,有若干個參數可用。然而,最經常使用的參數只有前兩個。app

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)dom

注意,第一個是強制性的,其他的是可選的。若是不添加mode參數,文件將在Python中以只讀模式打開。函數

encoding:能夠不寫。不寫參數,默認的編碼本是操做系統默認的編碼本。windows默認gbk,linux默認utf-8,mac默認utf-8。

f=open('test.txt',encoding='utf-8')   #打開文件
data=f.read()  #讀取文件
print(data)
f.close() #關閉文件         
複製代碼

mode

mode含義r文本模式,讀取rb二進制模式,讀取w文本模式,寫入wb二進制模式,寫入a文本模式,追加ab二進制模式,追加+可讀可寫

讀取文件

代碼中用到的文件文件操做的1.txt 文件內容以下:

關注編程阿喵
做者:阿喵
複製代碼

readline(),使用該方法時,須要指定打開文件的模式爲r或者r+;

readlines(),讀取所有行.返回一個列表,列表中的每一個元素是原文件的每一行。若是文件很大,佔內存,容易崩盤。

# 打開文件進行讀取
f = open("1.txt","r",encoding='utf-8')
# 根據大小讀取文件內容
print('輸出來自 read() 方法\n',f.read(2048))
# 關閉文件
f.close()
# 打開文件進行讀寫
f = open("1.txt","r+",encoding='utf-8')
# 讀取第2個字和第2行行的文件內容
print('輸出來自 readline() 方法\n',f.readline(2))
print('輸出來自 readlines() 方法\n',f.readlines(2))
# 關閉文件
f.close()
# 打開文件進行讀取和附加
f = open("1.txt","r",encoding='utf-8')
# 打開文件進行讀取和附加
print('輸出來自 readlines() 方法\n',f.readlines())
# 關閉文件
f.close()

# 輸出以下
輸出來自 read() 方法
 關注編程阿喵
做者:阿喵
輸出來自 readline() 方法
 關注
輸出來自 readlines() 方法
 ['編程阿喵\n']
輸出來自 readlines() 方法
 ['關注編程阿喵\n', '做者:阿喵']

複製代碼

寫入文件

下面只介紹清除寫 w和追加寫 a

案例:將關注編程阿喵寫入 test.txt 文件中

 

# mode=w 沒有文件就建立,有就清除內容,當心使用
with open('test.txt', 'w', encoding='utf-8') as fb:
      fb.write('關注編程阿喵\n')  
複製代碼

下面再將做者:編程阿喵寫入test.txt 文件中

with open('test.txt', 'w', encoding='utf-8') as fb:
      fb.write('做者:阿喵\n')  
複製代碼

運行後會發現 w模式會清除原文件內容,因此當心使用。只要使用了w,就要一次性寫完。

追加寫 a

案例:將靜夜思這首詩追加到 test.txt 文件中

# mode=a 追加到文件的最後
with open('test.txt', 'a', encoding='utf-8') as fb:
      fb.write('關注編程阿喵\n')  
with open('test.txt', 'a'encoding='utf-8') as fb:
      fb.write('做者:阿喵\n')      
複製代碼

指針操做

事物或資源都是以文件的形式存在,好比消息、共享內存、鏈接等,句柄能夠理解爲指向這些文件的指針。

句柄(handle)是一個來自編譯原理的術語,指的是一個句子中最早被規約的部分,因此帶有一個「句」字。

句柄的做用就是定位,兩個APi仍是tell和seek。

tell返回文件對象在文件中的當前位置,seek將文件對象移動到指定的位置,傳入的參數是offset ,表示移動的偏移量。

下面經過示例對上述函數做進一步瞭解,以下所示:

with open('test.txt', 'rb+') as f:
    f.write(b'阿喵')
    # 文件對象位置
    print(f.tell())
    # 移動到文件的第四個字節
    f.seek(3)
    # 讀取一個字節,文件對象向後移動一位
    print(f.read(1))
    print(f.tell())
    # whence 爲可選參數,值爲 0 表示從文件開頭起算(默認值)、值爲 1 表示使用當前文件位置、值爲 2 表示使用文件末尾做爲參考點
    # 移動到倒數第二個字節
    f.seek(-2, 2)
    print(f.tell())
    print(f.read(1))
    
#輸出以下
6
b's'
4
50
b'\r' 
複製代碼

上下文管理

咱們會進行這樣的操做:打開文件,讀寫,關閉文件。程序員常常會忘記關閉文件。上下文管理器能夠在不須要文件的時候,自動關閉文件,使用with open便可。

# with context manager
with open("new.txt", "w") as f:
    print(f.closed)
    f.write("Hello World!")
print(f.closed)

#輸出以下
False
True
複製代碼

如何批量讀取多個文件

下面,批量讀取某文件夾下的txt文件

 

file_list = ['1.txt', '2.txt', '3.txt','4.txt']
for path in file_list:
    with open(path, encoding='utf-8') as f:
        for line in f:
            print(line)
複製代碼

下面將批量讀取文件夾下的txt文件的內容,合併內容到一個新文件5.txt中,具體實現的代碼以下。

import os
#獲取目標文件夾的路徑
filedir = os.getcwd()+'\\'+'\\txt'
#獲取當前文件夾中的文件名稱列表
filenames = []
for i in os.listdir(filedir):
    if i.split(".")[-1] == 'txt':
        filenames.append(i)
#打開當前目錄下的5.txt文件,若是沒有則建立
f = open('5.txt','w')
#先遍歷文件名
for filename in filenames:
    filepath = filedir+'\\'+filename
    #遍歷單個文件,讀取行數
    for line in open(filepath,encoding='utf-8'):
        f.writelines(line)
        f.write('\n')
#關閉文件
f.close()
複製代碼

其實在Window中只須要cd 至目標文件夾,即你須要將全部想要合併的txt文件添加至目標文件夾中,執行以下DOS命令 type *.txt > C:\目標路徑\合併後的文件名.txt

練習

題目:建立文件data.txt,文件共100000行,每行存放一個1~100之間的整數,題目來源:牛客

import random

f = open(‘data.txt’,‘w+’)
for i in range(100000):
  f.write(str(random.randint(1,100)) + ‘\n’)
  f.seek(0)
  print(f.read())
  f.close()
複製代碼

題目:生成100個MAC地址並寫入文件中,MAC地址前6位(16進制)爲01-AF-3B,題目來源:牛客

import random
import string

def create_mac():
  MAC='01-AF-3B'
  hex_num =string.hexdigits #0123456789abcdefABCDEF
  for i in range(3):
    n = random.sample(hex_num,2)
    sn = '-' + ''.join(n).upper()
    MAC += sn
  return MAC

def main():
  with open('mac.txt','w') as f:
    for i in range(100):
      mac = create_mac()
      print(mac)
      f.write(mac+'\n')

main()
複製代碼

 

最後多說一句,想學習Python可聯繫小編,這裏有我本身整理的整套python學習資料和路線,想要這些資料的均可以進q裙947618024領取。

本文章素材來源於網絡,若有侵權請聯繫刪除。

相關文章
相關標籤/搜索