python day03_ 文件處理

1、文件操做的基本流程

計算機操做文件的過程python

#1. 打開文件,獲得文件句柄並賦值給一個變量
#2. 經過句柄對文件進行操做
#3. 關閉文件

1.文件的打開過程算法

# f被程序持有,文件被操做系統持有
f = open('file.txt', 'r', encoding='utf-8')  # r讀文件,文件必定要提早存在

#2. 經過句柄對文件進行操做
data=f.read()
#3. 關閉文件 f.close()

f=open('file.txt','r')的過程分析:
#一、由應用程序向操做系統發起系統調用open(...)
#二、操做系統打開該文件,並返回一個文件句柄給應用程序
#三、應用程序將文件句柄賦值給變量fapp

2.操做文件方法ide

# 操做文件
# data = f.read()  # 讀全部內容
# print(data)

# data = f.read(2)  # 讀指定字節數或字符數
# print(data)
# d1 = f.read(1)  # 在當前位置接着再讀1個字節或字符
# print(d1)

# line = f.readline()  # 讀取一行
# print(line)

# lines = f.readlines()  # 按行,將全部行一次一次讀出到list中
# print(lines)

# 關閉文件
# f.close()  # 操做系統對文件的持有權必定要在文件操做完畢後釋放w = open(r'file.txt', 'w', encoding='utf-8')
w.write('123\n') w.flush() # 數據量過大時,能夠手動將內存中的數據刷新到硬盤中
w.write('456\n') w.writelines(['000\n', '111\n', '222\n']) # 是否可讀可寫
print(w.readable()) print(w.writable()) w.close()

# 文件的遍歷:

# 最經常使用讀寫
with open('source', 'r', encoding='utf-8') as f1, open('target', 'w', encoding='utf-8') as f2:
for line in f1:
f2.write(line)工具

#掌握
f.read() #讀取全部內容,光標移動到文件末尾
f.readline() #讀取一行內容,光標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中

f.write('1111\n222\n') #針對文本模式的寫,須要本身寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,須要本身寫換行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#瞭解
f.readable() #文件是否可讀
f.writable() #文件是否可讀
f.closed #文件是否關閉
f.encoding #若是文件打開模式爲b,則沒有該屬性
f.flush() #馬上將文件內容從內存刷到硬盤
f.name

2、文件的操做模式編碼

主模式:
r:  文件必須存在的讀
w:  文件無需存在的寫,無建立,有清空再寫
a:  文件無需存在的寫,無建立,有在文件最後追加寫

從模式:
t:  按文本字符操做數據(默認模式)
b:  按文本字節操做數據
+:  可讀可寫

瞭解:
x:新建文件寫,若是文件已存在,拋異常
#1. 打開文件的模式有(默認爲文本模式):
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 之追加寫模式【不可讀;不存在則建立;存在則只追加內容】

#2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb 
wb
ab
注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼

#3. 瞭解部分
"+" 表示能夠同時讀寫某個文件
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】

3.with...open..語法加密

# with open語法
with open('file.txt', 'x', encoding='utf-8') as f:  # 不須要明文書寫f.close()
    # data = f.read()
    # print(data)
    print(f.readable())
    print(f.writable())

# 追加模式
with open('file.txt', 'a', encoding='utf-8') as f:
    f.write('123\n')
    print(123)
    print(123)
    f.write('456\n')
    f.flush()
    f.write('789\n')

4. 字節方式操做文件spa

"""
你好
好的
123
"""
# 注:b操做模式下不須要指定encoding,
# 緣由,由於b能夠對全部類型數據進行操做,包含文本/視頻/音頻等各類文件
# 而utf-8只是文本文件的編碼方式
# 數據在硬盤中本就以二進制進行存儲的,全部b默認操做就是對數據從硬盤到內存的拷貝
with open('file.txt', 'rb') as f:
    data = f.read()
    print(data)
    # 但若是數據要展示給用戶,文本文件就要涉及解碼,其餘文件須要經過專業工具打開
    print(data.decode('utf-8'))

with open('file.txt', 'ab') as f:
    f.write(b'\n\xe5\x91\xb5\xe5\x91\xb5')

# r+: 從頭開始寫, a+:從尾開始寫, w+:清空寫
with open('file.txt', 'rb+') as f:
    print(f.readable())
    print(f.writable())
    # print(f.read())
    f.write(b'999')

5.遊標操做操作系統

'''
123
你好
456
'''
with open('file.txt', 'w', encoding='utf-8') as f:
    f.write('123\n你好\n456\n')

# 大前提: 遊標操做必定要在b模式下進行操做,由於遊標必定按字節進行偏移
# seek(偏移量, 操做位置)
#  操做位置:0,從頭開始 1,從當前位置開始 2,從最後開始
with open('file.txt', 'rt', encoding='utf-8') as f:
    d1 = f.read(7)
    print(d1)
    f.seek(1, 0)
    d2 = f.read(1)
    print(d2)
# seek()在操做位置爲0時,能夠兼容t模式,但任然按字節進行偏移

with open('file.txt', 'rb') as f:
    d1 = f.read(14)
    print(d1)
    # f.seek(1, 1)  # 在當前位置日後偏移1個字節
    # f.seek(-1, 1)  # 在當前位置往前偏移1個字節
    f.seek(-3, 2)  # 將鼠標移至到文件末尾,往前偏移3個字節
    d2 = f.read(1)
    print(d2)

6.文件的修改3d

# 文件的修改
"""change.txt
name:Owen|age:16|gender:God
"""
# rb+:在當前位置進行覆蓋書寫
with open('change.txt', 'rb+') as f:
    f.seek(14, 0)
    print(f.read(2)) # 16
    f.seek(-2, 1)
    f.write(b'16')

# ab+:能夠操做遊標,但只對讀起做用,寫任然是最後追加
with open('change.txt', 'ab+') as f:
    f.seek(14, 0)
    print(f.read(2))
    f.seek(-2, 1)
    print(f.read(2))
    f.write(b'18')

with open('change.txt', 'rb+') as f:
    data = f.read()
    newData = data.decode('utf-8').replace('16', '016')
    f.seek(0, 0)
    f.write(newData.encode('utf-8'))

7.複製文件

# 複製文件
with open('old.txt', 'r', encoding='utf-8') as f1, open('new.txt', 'w', encoding='utf-8') as f2:
    # 文件的循環
    for line in f1:  # 對可讀文件對象直接遍歷循環,獲得的是一行行內容
        print(line)
        f2.write(line)

import os
with open('001.png', 'rb') as f1, open('002.png', 'wb') as f2:
    for line in f1:
        f2.write(line)
# 按指定路徑將文件刪除
os.remove(r'D:\python週末四期\day03\代碼\001.png')

練習一

# 練習,利用b模式,編寫一個cp工具,要求以下:
  1. 既能夠拷貝文本又能夠拷貝視頻,圖片等文件
  2. 用戶一旦參數錯誤,打印命令的正確使用方法,如usage: cp source_file target_file
#  提示:能夠用import sys,而後用sys.argv獲取腳本後面跟的參數
import sys
if len(sys.argv) != 3:
    print('usage: cp source_file target_file')
    sys.exit()

source_file,target_file=sys.argv[1],sys.argv[2]
with open(source_file,'rb') as read_f,open(target_file,'wb') as write_f:
    for line in read_f:
        write_f.write(line)
練習一

練習二:

#. 文件a.txt內容:每一行內容分別爲商品名字,價錢,個數,求出本次購物花費的總錢數
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3

做業:

# 做業一:
# 讀取⽂文件內容,分析出全部的帳號及對應的密碼
# ⽂文件內容:owen:123456|egon:123qwe|liuxx:000000
# 結果:
{
'owen': '123456',
'egon': '123qwe',
'liuxx': '000000'
}
# 分析:將⽂文件內容讀出,而後按|拆分出 帳號:密碼 格式的⼦子字符串串,再按:拆分紅 帳號及密碼,存放到字典中

#做業二:
# 完成登陸註冊系統(從空文件開始作)
# 需求分析:
'''
1.能夠循環登陸註冊,輸入1表明選擇登陸功能,輸入2表明註冊功能,輸入0表明退出,其餘輸入表明輸入有誤,重輸
2.用戶的帳號密碼信息存放在usr.txt⽂文件中,保證用戶註冊成功後,重啓系統,用戶信息仍然保存
3.登陸在帳號驗證經過才輸入密碼驗證登陸,帳號驗證三次失敗自動進入註冊功能,登陸三次驗證失敗自動退出系統
4.第一次註冊,文件寫入 帳號:密碼 信息,再次註冊追加寫入 |帳號:密碼 信息
# 做業一
with open('file3.txt','r',encoding='utf-8') as f:
    dic = []
    for line in f:
        line = line.replace('|',' ')
        # print(line)
        for i in line.split():
            i = i.split(':')
            dic.append(i)
            # print(dic)
db_user = dict(dic)
print(db_user)

# 做業二
#讀取文件,獲取帳號密碼
with open('usr.txt','r',encoding='utf-8') as f:
    dic = []
    for line in f:
        line = line.replace('|',' ')
        # print(line)
        for i in line.split():
            i = i.split(':')
            dic.append(i)
            # print(dic)
db_user = dict(dic)

tag = True
while tag:
    print("1-->登陸   2-->註冊  0-->退出")
    choice = ['0','1','2']
    cmd = input("請選擇功能:")
    if not cmd or cmd not in choice: continue
    if cmd == '1': #功能判斷
        count = 0
        while count < 3:
            username = input("請輸入帳號:").strip()
            if not username or username not in db_user.keys():  # 判斷帳號是否存在
                # print("帳號不存在,是否註冊")
                continue
            password = input("請輸入密碼:").strip()
            if password == db_user[username]: #帳號密碼匹配,登陸成功
                print("登陸成功")
            else:
                print("帳號密碼錯誤")
                count += 1
        break
    elif cmd == '2':
        re_name = input("請輸入帳號:").strip()
        # 帳號不存在繼續輸入密碼
        if re_name not in db_user.keys():
            while True:
                re_pass1 = input("請輸入密碼:")
                re_pass2 = input("請再次輸入密碼:")
                if re_pass1 == re_pass2:  #2次密碼正確寫入帳號密碼文件
                    with open('usr.txt','a',encoding='utf-8') as fl:
                        fl.write('|'+ re_name + ':' + re_pass2)
                    print("註冊成功")
                    break
                else:
                    print("2次輸入的密碼不一致,請從新輸入")
        else:
            print("帳號已存在")
    elif cmd == '0':
        break
做業

練習三

# 簡單秒傳案例
mk = b""
# 計算獲得秒傳依據
with open('002.png', 'rb') as f:
    data = f.read()
    # print(data)
    length = len(data)
    print(length)
    # 設置秒傳算法:1.截取的部分字節,2.加密字節的算法

    # 1.從頭開始讀10個字節,中間讀10個字節,末尾讀10個字節
    # 2.將全部數據進行拼接
    f.seek(0, 0)
    d1 = f.read(10)
    f.seek(length // 2, 0)
    d2 = f.read(10)
    f.seek(-10, 2)
    d3 = f.read(10)
    mk = d1 + d2 + d3

print(mk)

# 實現秒傳
with open('200.png', 'rb') as f:
    new_mk = b''
    f.seek(0, 0)
    new_mk += f.read(10)
    f.seek(length // 2, 0)
    new_mk += f.read(10)
    f.seek(-10, 2)
    new_mk += f.read(10)
    if new_mk == mk:
        print('秒傳')
    else:
        print('調用上傳方法,進行龜速上傳')

# with open('200.png', 'rb+') as f:
#     f.seek(-7, 2)
#     f.write(b'12')
View Code
相關文章
相關標籤/搜索