Python檔案的讀寫以及解決報錯io.UnsupportedOperation: not readable

肥鼠路易發表於2020-11-26

編碼解碼知識

在這裡插入圖片描述

print('肥鼠'.encode('utf-8'))
print('肥鼠'.encode('gbk'))
print(b'\xe8\x82\xa5\xe9\xbc\xa0'.decode('utf-8'))
print(b'\xb7\xca\xca\xf3'.decode('gbk'))

列印出來的是下圖

b'\xe8\x82\xa5\xe9\xbc\xa0'
b'\xb7\xca\xca\xf3'
肥鼠
肥鼠

如果出現報錯SyntaxError: unexpected EOF while parsing,看看我們是否少打了括號之類的

print(b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2\xe4\xbd\xa0'.decode('utf-8'))
print(b'\xce\xd2\xcf\xb2\xbb\xb6\xc4\xe3'.decode('gbk'))

哈哈哈,這是程式設計師的一種悶騷表白方式。

我喜歡你
我喜歡你

所謂的編碼,其實本質就是把str(字串)型別的資料,利用不同的編碼表,轉換成bytes(位元組)型別的資料。

print(type('肥鼠'))
print(type(b'\xe8\x82\xa5\xe9\xbc\xa0')) 
<class 'str'>
<class 'bytes'>

\x代表分隔符

$ python
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> open('/home/warmtree/文件/919.odt')
<_io.TextIOWrapper name='/home/warmtree/文件/919.odt' mode='r' encoding='UTF-8'>
>>> file=open('/home/warmtree/文件/919.odt','r',encoding='utf-8')
>>> filecont=file.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/warmtree/anaconda3/lib/python3.7/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc6 in position 15: invalid continuation byte
>>> print(file.read())


報錯

f = open('./1.txt', 'a',encoding='utf-8') 
f.write('難唸的經\n')
fc=f.read()
print(fc)
f.close()
io.UnsupportedOperation: not readable

為什麼不能直接在write()後面直接承接read()

f1 = open('./1.txt','a',encoding='utf-8') 
#以追加的方式開啟一個檔案,儘管並不存在這個檔案,但這行程式碼已經建立了一個txt檔案了
f1.write('難唸的經')
#寫入'難唸的經'的字串
f1.close()           
#關閉檔案 

f2 = open('./1.txt','r',encoding='utf-8')
#以讀的方式開啟這個檔案
content = f2.read()
#把讀取到的內容放在變數content裡面
print(content)
#列印變數content
f2.close()
#關閉檔案

在這裡插入圖片描述

新的知識點

為了避免開啟檔案後忘記關閉,佔用資源或當不能確定關閉檔案的恰當時機的時候,我們可以用到關鍵字with,之前的例子可以寫成這樣:

# 普通寫法
file1 = open('abc.txt','a') 
file1.write('張無忌') 
file1.close()

# 使用with關鍵字的寫法
with open('abc.txt','a') as file1:
#with open('檔案地址','讀寫模式') as 變數名:
    #格式:冒號不能丟
    file1.write('張無忌') 
    #格式:對檔案的操作要縮排
    #格式:無需用close()關閉

小練習

在這裡插入圖片描述為什麼這樣的讀取方式為空

file=open('/home/warmtree/code/python/test.txt','r',encoding='utf-8')
file_content=file.read()
print('file.read()\n',file_content)
file_lines = file.readlines()      
file.close()
print(file_lines)

在這裡插入圖片描述重新書寫一遍檔案open則可以逐行顯示:

# open the file using open()
file=open('/home/warmtree/code/python/test.txt','r',encoding='utf-8')
file_content=file.read()
print('file.read()\n',file_content)
file.close()
'''
file_lines = file.readlines()      
file.close()
print(file_lines)
'''
file1 = open('/home/warmtree/code/python/test.txt','r',encoding='utf-8') 
file_lines = file1.readlines()      
file1.close()
print(file_lines)

在這裡插入圖片描述

# open the file using open()
file=open('/home/warmtree/code/python/test.txt','r',encoding='utf-8')
file_content=file.read()
print('file.read()\n',file_content)
'''
file.read()
 羅恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 90
馬爾福 100 85 90

'''
file.close()
'''
file_lines = file.readlines()      
file.close()
print(file_lines)
'''
file1 = open('/home/warmtree/code/python/test.txt','r',encoding='utf-8') 
file_lines = file1.readlines()      
file1.close()
#readlines() 會從txt檔案取得一個列表,列表中的每個字串就是scores.txt中的每一行。而且每個字串後面還有換行的\n符號
print(file_lines)
'''
['羅恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 90\n', '馬爾福 100 85 90']
'''
for i in file_lines:    #用for...in...把每一行的資料遍歷
    print(i)            #列印變數i
'''
羅恩 23 35 44

哈利 60 77 68 88 90

赫敏 97 99 89 91 95 90

馬爾福 100 85 90
'''
#把這裡每一行的名字、分數也分開,這時需要我們使用split()來把字串分開,它會按空格把字串裡面的內容分開
for i in file_lines:   #用for...in...把每一行的資料遍歷  
    data =i.split()    #把字串切分成更細的一個個的字串
    print(data)        #列印出來看看
'''
['羅恩', '23', '35', '44']
['哈利', '60', '77', '68', '88', '90']
['赫敏', '97', '99', '89', '91', '95', '90']
['馬爾福', '100', '85', '90']

'''

Join()用於字串的合併

a=['c','a','t']
b=''
print(b.join(a))
# c a t
c='-'
print(c.join(a))
#c-a-t

有些問題待處理


file1 = open('winner.txt','r',encoding='utf-8') 
file_lines = file1.readlines() 
file1.close()
print(file_lines)
dict_scores={}
list_scores = []
final_scores = []
for data in file_lines:
    data.split()
    print(data[0:3])
    print(data[-4:])
    list_scores.append(int(data[-4:]))
    #del data[-4:]
    print(data)
print(list_scores)
list_scores.sort()
print(list_scores)

相關文章