python--檔案操作指南

正霜霜儿發表於2024-04-15
'''
1. 什麼是檔案:
檔案是操作 系統給使用者/應用程式操作硬碟的一種虛擬的概念/介面
使用者/應用程式
作業系統(檔案)
計算機硬體(硬碟)
2. 為何要用檔案
使用者/應用程式可以透過檔案將資料永久儲存的硬碟中,即操作檔案就是操作硬碟
使用者/應用程式直接操作的是檔案,對檔案進行的所有的操作都是在向作業系統呼叫,然後再由操作將其轉換成具體的硬碟操作
3. 如何使用檔案 open()
    控制檔案讀寫內容的模式
    t和b不能單獨使用,必須與r/w/a連用
    t文字 (預設的模式)1讀寫都以str(unicode)為單位的;2.文字檔案 3.必須指定encoding='utf-8'
    b二進位制/bytes
    控制檔案讀寫操作的模式
    r:只讀模式
    w:只寫模式
    a:只追加寫模式
    +:r+、w+、a+
'''
'''
操作檔案'''
# 1. 開啟檔案
# f=open(r'aaa/a.txt',mode='rt') #f的值是一種變數,佔用的是應用程式的記憶體空間
# #print(f) #<_io.TextIOWrapper name='aaa/a.txt' mode='r' encoding='UTF-8'>
# # 2.操作檔案,讀/寫檔案
# res=f.read()
# print(res)
# # 3. 關閉檔案
# f.close()   #回收作業系統資源
# #del f       #回收應用程式資源
# print(f)
# f.read()  #ValueError: I/O operation on closed file.
'''with 語法'''
# with open(r"aaa/a.txt",mode='wt',encoding='utf-8') as f1,\
#         open(r'aaa/b.txt') as f2:
# #    res1=f1.read()  #解碼:windows預設是gbk,linux utf-8,
# #    res2=f2.read()
# #    print(res1,res2)
#     res1=f1.write("哈哈哈")
#     print(res1)
# ''''''

# username='dandan'
# password='123'
# inp_username=input("please input your name: ").strip()
# inp_password=input("please input your password: ").strip()
# if inp_username==username and inp_password==password:
#     print("you login successfully!")
# else:
#     print("the name or password is incorrect!")

# inp_username = input("please input your name: ").strip()
# inp_password = input("please input your password: ").strip()
# with open(r"aaa/user.txt",mode='rt',encoding='utf-8') as f1:
#     for line in f1:
# #        print(line,end='')
#         username,password=line.strip().split(':')
# #        print(line)
#         if inp_username==username and inp_password==password:
#             print("you login successfully!")
#             break
#     else:
#         print("the name or password is incorrect!")
'''w :不建議用開啟,一開啟就清空啦'''
# with open("aaa/c.txt",mode='wt',encoding='utf-8') as f:
#     f.write("wu~~~\n")

#以w模式開啟檔案沒有關閉的情況下,連續的寫,新的內容總在舊的後面
# with open("aaa/c.txt",mode='wt',encoding='utf-8') as f:
#     f.write("wu~~~\n")
#     f.write("hahahah\n")
#     f.write("第三行\n")
#重新以w模式開啟檔案,則會清空檔案內容
# with open("aaa/c.txt",mode='wt',encoding='utf-8') as f:
#     f.write("1.wu~~~\n")
# with open("aaa/c.txt",mode='wt',encoding='utf-8') as f:
#     f.write("2.hahaha~~~\n")
# with open("aaa/c.txt",mode='wt',encoding='utf-8') as f:
#     f.write("3.666~~~\n")

'''a:只追加寫,在檔案不存在的時候'''
# with open("aaa/d.txt",mode='at',encoding='utf-8') as f:
# #    f.read() #io.UnsupportedOperation: not readable
#      f.write("開始寫內容了")
# with open("aaa/d.txt",mode='at',encoding='utf-8') as f:
# #    f.read() #io.UnsupportedOperation: not readable
#      f.write("\n2。之前的內容還在")
#相同點:在開啟的檔案不關閉的情況下,連續的寫入,新寫的內容總會在前寫的後面
#不同點:以a模式重新開啟檔案,不會清空原檔案內容,會將檔案指標直接到檔案的末尾
#一般是用來記錄日誌
#a 模式用來在原有內容的基礎上進行追加,例如使用者註冊功能
# name=input("please input your name: ")
# pwd=input("please input your password: ")
# with open("aaa/user.txt",mode="at",encoding='utf-8') as f:
#     f.write("{}:{}\n".format(name,pwd))

"""w 用作建立全新的檔案 """
##檔案的copy工具:
# with open("aaa/user.txt",mode="rt",encoding="utf-8")as f1,\
#     open("aaa/user01.txt",mode="wt",encoding="utf-8")as f2:
#     res=f1.read()
#     f2.write(res)

# src_file=input("原始檔檔案:")
# dst_file=input("目標檔案:")
# with open(r"{}".format(src_file),mode="rt",encoding="utf-8")as f1,\
#     open(r"{}".format(dst_file),mode="wt",encoding="utf-8")as f2:
#     res=f1.read()
#     f2.write(res)

'''b 模式 binary 模式,讀寫都是以bytes 為單位,可以針對所有檔案,*一定不能指定utf-8'''
# with open(r"aaa/WechatIMG4.jpeg",mode='rb') as f:
#     res=f.read() #硬碟的二進位制讀入記憶體->b模式下,不做任何轉換,直接讀入記憶體
#     print(res) #byte型別-->當成二進位制

'''指標移動的單位都是以bytes/位元組為單位
只有一種特殊情況:t模式下的read(n),n 代表的是字元個數'''

# with open(r'aaa/d.txt',mode='rt',encoding='utf-8')as f:
#     res=f.read(4)
#     print(res)

# f.seek(n,模式);n指的是移動的位元組個數
#模式:
'''0:參照物是檔案開頭位置'''
# f.seek(9,0)
# f.seek(3,0)  #3
'''1:參照物是當前指標所在位置'''
# f.seek(9,1)
# f.seek(3,1) #12
'''2:參照物是檔案的末尾位置,應該是倒著移動'''
# f.seek(-9,2) #3
# f.seek(-3,2) #9
#
# f.tell() #獲取當前指標的位置
with open(r"aaa/a.txt",mode='rt') as f:
    f.seek(9,0)
    f.seek(3,0)
    print(f.tell())
    res=f.read()
    print(res)