學習python第十七天,檔案處理
讀取檔案
讀取檔案之前我們都需要將檔案放在代碼的相同路徑里,,方便讀取
以下面一個檔案示例
import sys
print(sys.getdefaultencoding())
# 這里是判斷輸出電腦讀取檔案的默認編碼
file = open(file='致橡樹.txt', mode='r', encoding='utf-8')
try:
data = file.read(32)
print(data, end='')
except:
print('讀檔案發生錯誤')
pass
finally:
file.close()
import sys
print(sys.getdefaultencoding())
file = open(file='致橡樹.txt', mode='r', encoding='utf-8')
try:
data = file.read(32)
while data:
print(data, end='')
data = file.read(32)
except:
print('讀檔案發生錯誤')
pass
finally:
file.close()
讀取txt檔案,直接打開,選擇read---->‘r’, 讀取的編碼選擇電腦使用的’utf-8’
這里用try except來捕獲讀取檔案發生例外的情況,如果發生例外不報錯但是會從except提醒發生例外
在讀取檔案完畢之后我們要關閉檔案,否則檔案將一直處于被操作狀態,
finally:
? file.close()
用于關閉檔案,無論代碼執行成什么樣,finally縮減里的代碼都會執行,也就是說無論前面的代碼,是否出錯,但是檔案已經打開,我們就要在最后將其關閉
第二種讀法是為了節省記憶體,我們在讀取檔案的時候呢會占用系統記憶體,如果整篇檔案一起讀就會占用較大的記憶體,所以選擇用回圈的方式32個字符32個字符的讀取,注意這里并非只能是32也可以是16、32、64、128、256、512.,,,,但要是2的次方,
檔案操作
讀取二進制檔案,位元組檔案
我們以一張圖片為例
這里匯入到模塊是為了移動檔案指標,指標就好比是串列的索引,這兩個模塊對應著檔案的最后一個指標和第一個
其實不用它也可以,(0,2)也是一樣的😂,但是還是要用,比較高級
from io import SEEK_END, SEEK_SET
# 'rb'讀取二進制檔案
file = open(file='beautyful_gril.jpg', mode='rb')
# 如果希望獲得檔案的位元組數,可以先用seek將檔案指標移到檔案末尾
# file.seek(0, 2)
file.seek(0, SEEK_END)
# 然后通過tell方法獲取檔案指標移動的位元組數,這個位元組數就是檔案的大小
print(file.tell())
# 將檔案指標移到檔案最開始的位置
# file.seek(0, 0)
file.seek(0, SEEK_SET)
# print(len(file.read()))
try:
data = file.read(512)
while data:
print(file.tell())
print(data, end='')
data = file.read(512)
finally:
file.close()
知道位元組數我們好確定使用的回圈的位元組段大小,我的這張圖片有18萬多個位元組所以我選用512個位元組作為回圈
這里沒有except也就是如果報錯就什么都不輸出
寫文本檔案
寫一篇將進酒!
# 操作模式-- a -- 創建新檔案或將檔案指標移動到原有檔案的末尾再寫入新內容
#file = open('將進酒.txt', mode='a', encoding='utf-8')
with open('小雨康橋.txt', mode='a', encoding='utf-8') as
try:
file.write('君不見黃河之水天上來,奔流到海不復回\n')
file.write('君不見高堂明鏡悲白發,朝如青絲暮成雪\n')
file.write('人生得意須盡歡,莫使金樽空對月\n')
file.write('天生我材必有用,千金散盡還復來\n')
pass
finally:
file.close()
當然也可以一句一句的寫,
用with open as 的方法看起來更加高級,增加代碼的可讀性,目的一樣,但是更加優雅
檔案復制
我們以函式的方式來實作
還是以那張圖片為例
def file_copy(source_file, target_file):
"""復制檔案
第一個引數是目標檔案名
第二個引數是復制下來的檔案的檔案名
"""
with open (source_file, 'rb') as source:
with open(targey_file, 'wb') as target:
# 'wb',寫二進制檔案,這里就是創建一個二進制檔案將之前的二進制檔案寫進去
data = source.read(512)
while data:
# 當data為空時就說明檔案已經讀取完畢,結束回圈
target.write(data)
# 將讀取出來的二進制檔案一次寫入新的檔案
data = source.read(512)
if __name__ == '__main__':
file_copy('beautyful_gril.jpg','C:/Users/86187/Desktop/beautyful_gril.jpg')
# 我這里是將它存在桌面上,存盤時一定要選擇存盤的位置
練習
將一百以內的質數寫入檔案,每行一個數
def is_prime():
for i in range(2, num):
if num % i == 0:
return False
return True
def main():
with open('100以內的質數.txt', mode='a', encoding='utf-8') as file:
for num in range(2, 100):
if is_prime(num):
file.write(f'{num}\n')
if __name__ = '__ main__':
main()
從上往下以此為
判斷質數函式
回圈1~100,將回圈匯入求質數函式如果回傳的時True就說明是質數就寫入檔案
讀取csv(逗號分隔值)檔案
with open('2018年北京積分落戶資料.csv', mode='r', encoding='utf-8') as file:
content = file.readline()
while content:
values = content.replace('\n', '').split(',')
print(values)
content = file.readline()
import csv
with open('2018年北京積分落戶資料.csv', mode='r', encoding='utf-8') as file:
# delimiter------>設定分隔符,默認英語的逗號
# quotechar------>包裹字串的符號
reader = csv.reader(file, delimiter=',', quotechar='"')
for row in reader:
print(row)
第一種讀法,是將檔案一行一行的讀取,然后遍歷每一行,遍歷行得到一個個的字串,將轉行的字串,用逗號替代轉行字符,就不會轉行,使用split將字串放進串列里
第二種就直接匯入模塊使用里面的函式替代第一種方法的步驟
練習
寫一個檔案將10個學生的三門課程成績寫進去,三門課程的成績用亂數生成
import random
with open('score.csv', 'w', newline='') as file:
#newline=''的使用是為了避免空行,可以分別運行有它和沒它后觀察結果
writer = csv.weiter(file)
wreiter.writerow('學生姓名', '語文', '數學', '英語')
for _ in range(10):
name_student = input('學術姓名: '):
list1 = []
for _ in range(3)
score = random.randrange(50, 100)
list1.append(score)
writer.writerow(name_stuudent, list1[0], list[1], list[2])
作業2:讀取剛才的CSV檔案,計算每個學生的平均分,統計每門課的最高分、最低分、標準差
def standard_deviation(nums: list):
avg = aravge(nums)
total = 0
avg_total = 0
for num in nums:
avg_total = (avg - num) ** 2
return (avg_total / len(nums)) ** 0.5
def main():
with open('score.csv', 'r') as file:
content1 = file.readline()
content = file.readline()
chinese = []
math = []
english = []
while content:
value = content.replace('\n', '').split(',')
name = value[0]
x, y, z = value = [int(i) for i in value[1:]]
chinese.append(x)
math.append(y)
english.append(z)
avg_score = sum(value) / len(value)
print(f'{name}平均分為{avg_score:.2f}')
content = file.readline()
for i in [chinese, math, english]:
if i == chinese:
object = '語文'
elif i == math:
object = '數學'
else:
object = '英語'
print(f'{object}最高分最低分分別為{max(i)}和{min(i)},標準差為{standard_deviation(i)}')
# print(f'語文最高最低分分別分為{max(chinese)}和{min(chinese)},'
# f'數學最高最低分分別分為{max(math)}和{min(math)},'
# f'英語最高最低分分別分為{max(english)}和{min(english)}')
# print(f'語文標準差為{standard_deviation(chinese)},'
# f'數學標準差為{standard_deviation(math)}, '
# f'英語標準差為{standard_deviation(english)}')
if __name__ == '__main__':
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293969.html
標籤:python
