一. python進階(文件的讀寫編碼)


一. 讀取文件

過程:
   打開文件
   讀文件內容
   關閉文件

打開文件:
       open(path,flag,[encoding [ERRORS]])
        path:要打開文件的路徑
        flag :打開方式
            * r      以只讀的方式打開文件 文件法人描述符放在開頭     
            * rb     以二進制格式打開一個文件用於只讀 文件的描述符放在開頭  (二進制用來加密)
              r+     打開一個文件用於讀寫 文件的描述符放在開頭
            * w       打開一個文件只用於寫入 如果該文件已經存在會覆蓋 如果不存在則創建新文件
            * wb     打開一個文件只用於寫入二進制 如果該文件已經存在會覆蓋 如果不存在則創建新文件
            * w+     打開一個文件用於讀寫
             a      打開一個文件用於追加 如果文件存在 文件描述符將會放到文件末尾
             a+      
        encoding    編碼格式   常用的的是utf-8
        ERRORS      錯誤處理  

 1.read() 與rend(參數)

# 打開文件
path=r"D:\Studypython\py2\1\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")
# 讀文件內容
# 讀取文件里的所有內容    read()
str1=f.read()
print(str1)  

# my name is 哈哈哈
# i lover you to
# 哈哈哈哈啦啦啦
# 關閉文件
# 打開文件

path=r"D:\Studypython\py2\01.txt"

# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")
# 讀文件內容
# 讀取文件里面10個字符    read(10)

# 讀取文件里指定字符數read(n)
str1=f.read(10)   
print(str1)   # my name is

# 關閉文件

 2.readline() 與 readline(參數)  readlines() 

# 打開文件
path=r"D:\Studypython\py2\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")

# 讀文件內容
#讀取文件里內容一整行  包括換行符 /n                     readline
str1=f.readline()   
print(str1)   # my name is 哈哈哈
# 關閉文件




path=r"E:\Studypython\py2\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")

# 讀文件內容
  讀取指定字符串    
str1=f.readline(10)   
print(str1)   # my name is 哈哈哈
# 打開文件
path=r"D:\Studypython\py2\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")

# 讀文件內容
#讀取文件里內容 所有行    並返回列表                    readlines
str1=f.readlines()   
print(str1)   # my name is 哈哈哈
#['my name is 哈哈哈\n', '\n', 'i lover you to\n', '\n', '哈哈哈哈啦啦啦']
# 關閉文件
# 打開文件
path=r"D:\Studypython\py2\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")
# 讀文件內容
# 若給定的數字大於0 返回實際size節的行數
str1=f.readlines(25)   
print(str1)   
# ['my name is 哈哈哈\n', '\n', 'i lover you to\n']
# 關閉文件
f.close()

3. seek (str)  表示從第字符開始文件內容

# fileObject.seek(offset[, whence])
# 參數
# offset -- 開始的偏移量,也就是代表需要移動偏移的字節數
# whence:可選,默認值為 0。給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。
# 返回值

# 打開文件
path=r"D:\Studypython\py2\01.txt"
# 忽略錯誤  ignore
# f=open(path,"r",encoding="utf-8",errors="ignore")
f=open(path,"r",encoding="utf-8")
# 讀文件內容
# 修改描述符的位置
# seek (str)  表示從第字符開始文件內容
# seek() 方法用於移動文件讀取指針到指定位置。
f.seek(10)
str1=f.read()   
print(str1)   
#  哈哈哈
# i lover you to
# 哈哈哈哈啦啦啦
# 關閉文件
f.close()
# 打開文件讀文件的一個完整的過程  方法一
# 
path=r"E:\Studypython\py2\1\01.txt"

try:
    f=open(path,"r",encoding="utf-8")
    str1=f.read()   
    print(str1)   

finally:
    if f:

       f.close()

# my name is 哈哈哈

# i lover you to

# 哈哈哈哈啦啦啦
# 關閉文件
# 打開文件讀文件的一個完整的過程  方法二

with open(path,"r",encoding="utf-8") as f2:
     print(f2.read())

#      my name is 哈哈哈
# i lover you to
# 哈哈哈哈啦啦啦

二 .寫文件

# 寫文件
path=r"E:\Studypython\py2\1\02.txt"
f=open(path,"w",encoding="utf-8")
# 1 將信息寫入緩沖區
f.write("my name is hao do you do")
# 2 刷新緩沖區
#  直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待 自動刷入緩沖區

f.flush()
while True:
    pass
f.close()
# 寫文件
import time
path=r"E:\Studypython\py2\1\03.txt"
f=open(path,"w",encoding="utf-8")
# 1 將信息寫入緩沖區
# 2 刷新緩沖區
#  直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待 自動刷入緩沖區

# f.flush()
while 1:
     f.write("my name is hao do you doLLLLLLLLLLLLLLLLLLLLLLLLLLLL")
     f.flush()
     time.sleep(0.1)
f.close()
# 寫文件
import time

# 簡易寫法 寫文件    
# 這種寫法不用關閉和刷新
path=r"D:\Studypython\py2\1\04.txt"
with open(path,"a",encoding="utf-8")as f2:

    f2.write("哈哈哈哈哈啊哈哈哈哈啊哈哈哈哈哈哈哈哈")

1.案例

path=r"D:\Studypython\py2\1\05.txt"
# 注意編碼和解碼的字符集要一致
# 寫入文件編碼
with open(path,"wb")as f2:
    str="my name is haha  heee1s 張三豐"
    f2.write(str.encode("utf-8"))

# 讀文件解碼
with open(path,"rb") as f3:
   data=f3.read()
   print(data)               #  b'my name is haha  heee1s'  帶b的二進制
   print(type(data))         #  <class 'bytes'>             字節類型
   
   newData=data.decode("utf-8")
 
   print(newData)
import pickle  #數據持久性模塊


# 寫入文件
path=r"E:\Studypython\py2\2\01.txt"
mylist=[1,2,3,4,5,6,"sumk is a good man fffffffffffffffffffffffffffffffffffffffffffff"]

f=open(path,"wb")
pickle.dump(mylist,f)
f.close()
# 用於序列化的兩個模塊
#   json:用於字符串和Python數據類型間進行轉換
#   pickle: 用於python特有的類型和python的數據類型間進行轉換
#   json提供四個功能:dumps,dump,loads,load
#   pickle提供四個功能:dumps,dump,loads,load

# pickle可以存儲什么類型的數據呢?
# 所有python支持的原生類型:布爾值,整數,浮點數,復數,字符串,字節,None。
# 由任何原生類型組成的列表,元組,字典和集合。
# 函數,類,類的實例


# 讀取文件
f2=open(path,"rb") 
timelist=pickle.load(f2)
print(timelist)
f2.close()  
# [1, 2, 3, 4, 5, 6, 'sumk is a good man fffffffffffffffffffffffffffffffffffffffffffff']

三. 編碼

Python中默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確打印漢字,所以在讀取中文時會報錯。

解決方法為只要在文件開頭加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了

TF-8 --> decode 解碼 --> Unicode

        Unicode --> encode 編碼 --> GBK / UTF-8 等

        使用type可以查看編碼形式,unicode是‘unicode’,gbk和utf-8是‘str或bytes’。

# byte為字節,bit為位,1byte=8bit。
# 數據存儲是以“字節”(Byte)為單位,數據傳輸是以大多是以“位”(bit,又名“比特”)為單位,一個位就代
# 表一個0或1(即二進制),每8個位(bit,簡寫為b)組成一個字節(Byte,簡寫為B),是最小一級的信息單位。
# # print(help(list))
a = '編碼'                       # a是unicode類型
b = a.encode('utf-8')       # b是utf-8類型
c = a.encode('gbk')        #c是gbk類型
print (a ,b,c)
print (type(a),type(b),type(c))
#python3默認是unicode類型
# 編碼 b'\xe7\xbc\x96\xe7\xa0\x81' b'\xb1\xe0\xc2\xeb'
# <class 'str'> <class 'bytes'> <class 'bytes'>


print("**********************************")

aa=bytes('你好',encoding="GBK")          # unicode 轉換成GBK的bytes
print(aa)       #    b'\xc4\xe3\xba\xc3'
# 編碼encoding
print(aa.decode('GBK'))  # 你好


print("**********************************")

# 解(碼)decode
bb=bytes('你好你是誰',encoding="utf-8")  # unicode 轉換成utf-8的bytes
print(bb)     #  b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81'
print(bb.decode("utf-8"))   # 你好你是誰

print("**********************************")

# 網絡編程只能二進制
# 照片和視頻也只能二進制存儲
# html 網頁也是編碼
print(ord(""))      # 22909
print(ord("A"))     # 65
print(ord("5"))   # 53
print(chr(68))  # D

print("**********************************")
#repr() 函數將對象轉化為供解釋器讀取的形式。
# 返回一個對象的 string 格式

print(repr('1'))    # '1'
print(repr(1))   # 1


s = 'RUNOOB'
a=repr(s)
print(a)    # 'RUNOOB'

print("****************************************************")

dict = {'runoob': 'runoob.com', 'google': 'google.com'};
print(type(dict))   # <class 'dict'>
cc=repr(dict)  # {'runoob': 'runoob.com', 'google': 'google.com'}
print(cc)
print(type(cc))  # <class 'str'>


print("****************************************************")
decode                 encode
str ---------> str(Unicode) ---------> str
>>> u = '中文'                 # 指定字符串類型對象u
>>> str1 = u.encode('gb2312')  # 以gb2312編碼對u進行編碼,獲得bytes類型對象
>>> print(str1)
b'\xd6\xd0\xce\xc4'
>>> str2 = u.encode('gbk')     # 以gbk編碼對u進行編碼,獲得bytes類型對象
>>> print(str2)
b'\xd6\xd0\xce\xc4'
>>> str3 = u.encode('utf-8')   # 以utf-8編碼對u進行編碼,獲得bytes類型對象
>>> print(str3)
b'\xe4\xb8\xad\xe6\x96\x87'
>>> u1 = str1.decode('gb2312') # 以gb2312編碼對字符串str進行解碼,獲得字符串類型對象
>>> print('u1')
'中文'
>>> u2 = str1.decode('utf-8')  # 報錯,因為str1是gb2312編碼的
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
# 變成二進制   字節編碼   編碼轉換成二進制   注意:解碼和編碼要一致性
name="你好"
# 編碼
print(bytes(name,encoding='utf-8'))  #  b'\xe4\xbd\xa0\xe5\xa5\xbd'
# 解碼
print(bytes(name,encoding='utf-8').decode('utf-8'))  #  你好


# 編碼
print(bytes(name,encoding='gbk'))   # b'\xc4\xe3\xba\xc3'
# 解碼
print(bytes(name,encoding='gbk').decode('gbk'))  # 你好

 

# 編碼
s="張三來了哈哈哈"
print(type(s))
a=bytes(s,"utf-8")
print(a)
C=s.encode("utf-8")
print(C)
# <class 'str'>
# b'\xe5\xbc\xa0\xe4\xb8\x89\xe6\x9d\xa5\xe4\xba\x86\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'
# b'\xe5\xbc\xa0\xe4\xb8\x89\xe6\x9d\xa5\xe4\xba\x86\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM