1. 程式人生 > >Python全棧-day6-day7

Python全棧-day6-day7

並且 day6 源文件 自動 int 默認 單位 光標 aps

一、字符編碼

1.編碼基礎

  定義:人在使用計算機時,使用的是人類能夠讀懂的字符,使用者必須通過一張字符和數字間的相對應關系表實現人機交互,這一系列標準稱為字符編碼

  Python應用中解決核心字符串亂碼的最佳方法:用什麽格式編碼,就用什麽格式解碼

  參考:http://www.cnblogs.com/linhaifeng/articles/5950339.html#_label2

二、文件處理

1.文件基礎

  1)定義

  計算機系統分為:計算機硬件,操作系統,應用程序三部分。python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件。實際上,應用程序是無法直接操作硬件的,這就用到了操作系統。操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。

  2)操作文件的流程:

    a.打開文件,得到文件句柄並賦值給一個變量
    b.通過句柄對文件進行操作
    c.關閉文件

2.Python中文件操作

  1)打開文件的過程

# 打開文件,得到文件句柄並賦值給一個變量
f=open(test.txt,r,encoding=utf-8) #默認打開模式就為r,即只讀模式
# 通過句柄對文件進行操作
data=f.read()
# 關閉文件
f.close()

  打開文件的執行過程:

    a.應用程序想操作系統發起系統調用open()請求

    b.操作系統打開文件,將文件內容加載到內存中,並返回一個文件句柄給應用程序

    c.應用程序將文件句柄賦值給 f

  2)open()方法介紹

      open(r‘文件路徑‘,mode=‘打開方式‘,encoding=‘編碼格式‘)

      r作用:避免文件路徑中的特殊字符例如‘\‘被強制轉義,導致路徑無法識別

      打開方式:r/w/a(只讀只寫追加等)

      編碼格式:應用程序打開文件時,必須制定其打開的編碼格式,否則有可能出現亂碼

  3)文件打開的模式

技術分享圖片

打開文件的模式有(默認為文本模式):
r     只讀模式        默認模式,文件必須存在,不存在則拋出異常
w    只寫模式        不可讀;不存在則創建;存在則清空內容
a     追加寫模式     不可讀;不存在則創建;存在則只追加內容

對於非文本文件,只能使用b模式,
"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,
使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb wb ab 註意:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼 了解部分:
+ 表示可以同時讀寫某個文件 r+ 讀寫可讀,可寫 w+ 寫讀可讀,可寫 a+ 寫讀可讀,可寫

3.操作文件的方法

  讀文件操作:

  1)read()

# 讀取文件所有內容,光標移動到文件末尾
f = open(rtest.txt,r,encoding=utf-8)
prit(f.read())
f.close()

  2)readline()、readlines()

# f.readline()     讀取一行內容,光標移動到第二行首部
# f.readlines()    讀取每一行內容,存放於列表中 

# 單行讀取文件
print(f.readline())

# 多行讀取,且轉化為列表輸出
print(f.readlines())

  3)readable()

# 判斷文件是否可讀
print(f.readable())

  讀文件:

  1)write()

# 只寫模式
# 註意:
# 1.文件存在時,清空原來的內容
# 2.文件不存在是,創建空文件
# 3.默認不會自動換行寫入
f = open(rzhang.txt,w,encoding=utf-8) #默認是wt
f.write(第一行\n)
f.write(第二行\n)

# 追加寫的模式
# 註意:
# 1.文件存在時,光標移動到文件末尾,且將內容追加到文件默認
# 2.文件不存在是,創建空文件
f = open(rzhang.txt,a,encoding=utf-8) #默認是wt
f.write(第一行\n)
f.write(第二行\n)
f.close()

  2)其他內置方法

f.writable()    #判斷文件是否可讀
f.writelines()  #以列表形式,多行寫入

4.練習

  1)循環讀取文件

# open(r‘文件路徑‘,mode=‘打開方式‘encoding=‘編碼格式‘)
with open(rzhang.txt,mode=r,encoding=utf-8) as file:
    for line in file:
        time.sleep(1)
        print(line,end=‘‘)

  2)簡單寫文件,並且實現寫入的新內容總是置於文件末尾

with open(rzhang.txt,mode=a,encoding=utf-8) as file:
    file.write(第一天\n)

  3)文件打開之b模式

技術分享圖片
# 1.必須和其它模式組合使用,rb\wb\ab
# 2.b模式下讀寫都是以bytes為單位
# 3.b模式下不能指定encoding和decoding模式

# rb模式
with open(r120.jpg,rb) as f:
    data = f.read()
    print(data)
    print(type(data))

with open(rzhang.txt,rb) as f:
    data = f.read()
    print(data)
    print(data.decode(utf-8),end=‘‘)
    print(type(data))

# wb模式
# 不同編碼格式寫入,查看打開出現的情況
with open(r120.txt,wb) as f:
    msg = 你是豬嗎?
    f.write(msg.encode(gbk))
with open(r120.txt,wb) as f:
    msg = 你是豬嗎?
    f.write(msg.encode(utf-8))


# ab模式
with open(r120.txt,ab) as f:
    f.write(張哈哈.encode(utf-8))

# 可以看出.jpg以bytes的形式被存儲和打開了
with open(r120.jpg,rb) as f:
    for line in f:
        print(line)
View Code

5.作業:文件修改

  1)修改文件的實際

技術分享圖片
# 修改文件方式一:
# 1.先把文件全部讀到內存中
# 2.然後在內存中完成修改
# 3.再把修改後的結果覆蓋到源文件中
# 缺點:會在文件內容過大的情況下耗費過多的內存
with open(r修改文件.txt,r,encoding=utf-8) as f:
    data = f.read()
    data = data.replace(zhang,你是豬嗎?)
with open(r修改文件.txt,w,encoding=utf-8) as f:
    f.write(data)

# 修改文件方式二:
# 1.以讀的方式打開原文件
# 2.以寫的方式拷貝到新文件

import os
with open(r修改文件.txt,rt,encoding=utf-8) as src_f,        open(r修改文件.txt.swap,wt,encoding=utf-8) as dst_f:
    for line in src_f:
        if 你是豬嗎? in line:
            line = line.replace(你是豬嗎,啊哈哈)
        dst_f.write(line)
os.remove(修改文件.txt)
os.rename(修改文件.txt.swap,修改文件.txt)
View Code

  2)實現文件拷貝

rst_file = input(原文件路徑>>)
dst_file = input(目標文件路徑>>)

with open(r%s %rst_file,rb) as src_f,        open(r%s %dst_file,wb) as dst_f:
    for line in src_f:
        dst_f.write(line)

  3)拷貝文件和修改文件程序

技術分享圖片
# 編寫程序,提供兩種可選功能:
# 1)拷貝文件
# 2)修改文件
# 用戶輸入操作的編碼,根據用戶輸入的編號
# 執行文件拷貝(讓用戶輸入原文件路徑和目標文件路徑)
# 或修改操作

import os
print(選擇模式:)
warm = ‘‘‘
    1 拷貝文件
    2 修改文件
    輸入quit退出
‘‘‘
print(warm)
while True:
    choice = input(選擇操作>>).strip()
    if choice == 1:
        src_file = input(輸入原文件路徑>>).strip()
        dst_file = input(輸入目標文件路徑>>).strip()
        with open(r%s %src_file,rb) as src,            open(r%s %dst_file,wb) as dst:
                for line in src:
                    dst.write(line)
    elif choice == 2:
        dst_f = input(輸入要修改的文件路徑>>).strip()
        msg_old = input(輸入要修改的內容>>).strip()
        msg_new = input(修改後的內容>>).strip()
# # 方法一:
#         with open(r‘%s‘ %dst_f,‘r‘,encoding=‘utf-8‘) as f_old:
#             data = f_old.read()
#             data = data.replace(msg_old,msg_new)
#         with open(r‘%s‘ %dst_f,‘w‘,encoding=‘utf-8‘) as f_new:
#             f_new.write(data)
# 方法二:
        dst_f_swap = input(臨時交換的文件名>>)
        with open(r%s %dst_f,r,encoding=utf-8) as f_old,                open(r%s % dst_f_swap,w,encoding=utf-8) as f_new:
            for line in f_old:
                if msg_old in line:
                    line = line.replace(msg_old,msg_new)
                f_new.write(line)
        os.remove(dst_f)
        os.rename(dst_f_swap,dst_f)

    elif choice == quit:
        break
    else:
        print(沒有這個選項,請重新輸入...)
View Code

補充說明:資源回收

打開一個文件包含兩部分資源:操作系統級打開的文件+應用程序的變量。在操作完畢一個文件時,必須把與該文件的這兩部分資源一個不落地回收
回收方法為:
1)f.close() #回收操作系統級打開的文件
2)del f #回收應用程序級的變量

其中del f一定要發生在f.close()之後,否則就會導致操作系統打開的文件還沒有關閉,白白占用資源,而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢文件後,一定要記住f.close()

推薦傻瓜式操作方式:使用with關鍵字來幫我們管理上下文
with open(a.txt,w) as f:
    pass
 
with open(rtest.txt,r,encoding=utf-8) as f:
    data=f.read()

    

Python全棧-day6-day7