008-2018-09-12 檔案操作
阿新 • • 發佈:2018-12-18
1.今日內容大綱
一. 昨日內容回顧 1. join() 可以吧列表轉化成字串 split() 把字串轉化成列表 2. 關於刪除 列表在迴圈的時候不能進行刪除. 索引會跟著你刪除而改變 建立新列表. 把要刪除的內容放在新列表中. 迴圈新列表. 刪除老列表 字典在迴圈中不能刪除. 字典在迴圈的時候不能改變大小. 建立列表. 把要刪除的key儲存在列表中. 迴圈列表刪除字典 fromkeys(keys, value) 使用keys中的元素和value組合成key:value建立新字典 3. set集合 特點: 無序, 不重複, 可雜湊 set集合本身可變的. 不可雜湊. frozenset() 4. 深淺拷貝 1. 賦值. 沒有建立新物件. 2. 淺拷貝. 建立新的物件. 淺拷貝只複製一層內容 3. 深拷貝. 建立新物件. 把整個物件的內部全部都進行拷貝\ 女神(eva_j)的部落格 二. 作業講解 三. 今日主要內容 對檔案內部的內容進行操作 1. open("檔案路徑", mode="模式", encoding="編碼") 檔案的路徑: 1. 絕對路徑: 1. 從磁碟根目錄尋找 2. 網路上的路徑 2. 相對路徑 相對於當前你這個程式所在的資料夾.(用的最多的) 模式 r 讀. 只讀模式 w 寫 只能寫 a 追加寫, 只能寫入 b: bytes 這個時候處理檔案的是位元組 操作非文字檔案的時候用帶b的 rb wb ab r+ 讀寫模式 w+ 寫讀模式 a+ 追加讀模式 r+b w+b a+b 游標: 移動到開頭: seek(0) 移動到末尾: seek(0, 2) 檔案的修改: 1. 從原始檔中讀取內容. 修改內容. 寫入到檔案副本中. 2. 刪除原始檔. 重新命名檔案副本為原始檔的名字 with open(..) as f : 明天預習: 函式(非常重要, 簡單) 引數, 返回值
2.練習
''' 1. 判斷一個數是否是水仙花數, 水仙花數是一個三位數, 三位數的每一位的三次方的和還等於這個數. 那這個數就是一個水仙花數, 例如: 153 = 1**3 + 5**3 + 3**3 2. 給出一個純數字列表. 請對列表進行排序(升級題). 思路: 1. 完成a和b的資料交換. 例如, a = 10, b = 24 交換之後, a = 24, b = 10 2. 迴圈列表. 判斷a[i]和a[i+1]之間的大小關係, 如果a[i]比a[i+1]大. 則進行互換. 迴圈結束的時候. 當前列表中最大的資料就會被移動到最右端. 3. 想一想, 如果再次執行一次上面的操作. 最終第二大的資料就移動到了右端. 以此類推. 如果反覆的進行執行相應的操作. 那這個列表就變成了一個有序列表. 3. 完成彩票36選7的功 能. 從36個數中隨機的產生7個數. 最終獲取到7個不重複的資料作為最終的開獎結果. 隨機數: from random import randint randint(0, 20) # 0 - 20 的隨機數 4. 稅務部門徵收所得稅. 規定如下: 1). 收入在2000以下的. 免徵. 2). 收入在2000-4000的, 超過2000部分要徵收3%的稅. 3). 收入在4000-6000的, 超過4000部分要徵收5%的稅. 4). 收入在6000-10000的, 超過6000部分要徵收8%的稅. 4). 收入在10000以上的, 超過部分徵收20%的稅. 注, 如果一個人的收入是8000, 那麼他要交2000到4000的稅加上4000到6000的稅加上6000到8000的稅. 收入 = 8000-(4000-2000)*3%-(6000-4000)*4%-(8000-6000)*8% 讓使用者輸入它的工資, 計算終端使用者拿到手是多少錢. 默寫: 簡述什麼是深淺拷貝. 刪除列表中姓周的人的資訊 lst = [‘周芷若’, ‘周伯通’, ‘王重陽’, ‘周葫蘆娃’] ''' # 1.判斷一個數是否是水仙花數, 水仙花數是一個三位數, # 三位數的每一位的三次方的和還等於這個數. # 那這個數就是一個水仙花數, # 例如: 153 = 1**3 + 5**3 + 3**3 # num = input("請輸入一個三位數:") # if len(num) == 3: # result = int(num[0])**3 + int(num[1])**3 + int(num[2])**3 # if int(num) == result: # print("是一個水仙花數") # else: # print("不是水仙花數") # else: # print("親, 你輸入的不是三位數") # # 3.完成彩票36選7的功能. 從36個數中隨機的產生7個數. 最終獲取到7個不重複的資料作為最終的開獎結果. # 隨機數: # from random import randint # # s = set() # while len(s) < 7: # n = randint(1, 33) # s.add(n) # print(s) # 稅務部門徵收所得稅. 規定如下: # 1). 收入在2000以下的. 免徵. # 2). 收入在2000-4000的, 超過2000部分要徵收3%的稅. # 3). 收入在4000-6000的, 超過4000部分要徵收5%的稅. # 4). 收入在6000-10000的, 超過6000部分要徵收8%的稅. # 4). 收入在10000以上的, 超過部分徵收20%的稅. # 注, 如果一個人的收入是8000, 那麼他要交2000到4000的稅加上4000到6000的稅加上6000到8000的稅. # 收入 = 8000-(4000-2000)*3%-(6000-4000)*4%-(8000-6000)*8% # 讓使用者輸入它的工資, 計算終端使用者拿到手是多少錢. # salary = int(input("請輸入你的工資:")) # if salary <= 2000: # print("你不用交稅") # print("你的實際收入是%s" % salary) # elif salary <= 4000: # tax = (salary - 2000)*0.03 # print("你要交%s稅 " % tax) # print("你的實際收入是:%s" % (salary-tax)) # elif salary <= 6000: # tax = 2000* 0.03 + (salary-4000) * 0.05 # print("你要交%s稅 " % tax) # print("你的實際收入是:%s" % (salary - tax)) # elif salary <= 10000: # tax = 2000* 0.03 + 2000*0.05 +(salary - 6000) * 0.08 # print("你要交%s稅 " % tax) # print("你的實際收入是:%s" % (salary - tax)) # else: # tax = 2000 * 0.03 + 2000 * 0.05 + 4000 * 0.08 + (salary-10000) * 0.20 # print("你要交%s稅 " % tax) # print("你的實際收入是:%s" % (salary - tax)) # # # a = 10 # b = 20 # c = a # a = b # b = c # print(a, b) # a = 10 # b = 20 # a, b = b, a # print(a, b) # 大學課程中的資料結構-嚴蔚敏. # 氣泡排序(使用兩兩相鄰的數進行比較.) 快排, 插入排序, 歸併排序, 堆排序, 希爾排序 # 0 1 2 3 4 5 6 lst = [175, 160, 185, 134, 196, 128, 155, 170, 185, 189, 236] for j in range(len(lst)): # 第i個和第i+1個比較 for i in range(len(lst)-1): # 自己優化 if lst[i] > lst[i+1]: lst[i], lst[i+1] = lst[i+1], lst[i] print(lst)
3.基本檔案操作
# f = open("d:/小護士模特少婦女網紅.txt", mode="r", encoding="UTF-8") # # content = f.read() # 讀取內容, 讀取3個字元 # line1 = f.readline().strip() # 空白: 空格, \t, \n # line2 = f.readline().strip() # print(line1) # print(line2) # content = f.read() # 一次全都讀取出來. 缺點: 1. 讀取大的檔案的時候. 記憶體容易溢位 2. 操作比較麻煩 # content = f.readlines() # 也是全都載入進來了. # print(content) # f是一個可迭代物件 f = open("d:/周潤發大戰奧特曼.txt", mode="r", encoding="utf-8") # 預設跟著作業系統走的 GBK # for line in f: # 內部其實呼叫的是readline() # print(line) # f.close() # 關閉 # 列印的末尾是換行 # print("哈哈") # print("呵呵")
4.write()
f = open("d:/sylar.txt", mode="w", encoding="utf-8")
f.write("周筆暢\n") # 寫的時候. 先清空. 再寫入. w
f.write("胡辣湯\n")
f.write("實付款\n")
f.flush()
f.close()
5.append()
f = open("d:/sylar.txt", mode="a", encoding="utf-8")
f.write("娃哈哈") # 追加寫
f.write("爽歪歪")
f.flush()
f.close()
6.檔案拷貝
f1 = open("d:/linux學院-桌面背景.jpg", mode="rb")
f2 = open("E:/劉偉自拍.jpg", mode="wb")
for line in f1:
f2.write(line)
f1.close()
f2.flush()
f2.close()
7.讀寫模式
f = open("選單", mode="r+", encoding="utf-8") # r+最常見
s = f.read(1) # 讀取一個字元
print(s)
f.write("胡辣湯") # r+模式. 如果你執行讀了操作. 那麼寫操作的時候. 都是寫在檔案的末尾. 和游標沒有關係
# f.write("ab") # 在檔案開頭寫入. 寫入的是位元組,把原來的內容蓋上
# for line in f:
# print(line)
# f.write("蛋炒飯")
# 正確用法: 先讀後寫
f.close()
8.寫讀模式
f = open("選單", mode="w+", encoding="utf-8") # 很少用.
f.write("疙瘩湯")
f.seek(0) # 移動到開頭
content = f.read()
print("讀取的內容是", content)
f.flush()
f.close()
9.追加模式
f = open("選單", mode="a+", encoding="utf-8")
f.write("韭菜雞蛋餃子")
f.seek(0)
content = f.read()
print(content)
10.游標
f = open("選單", mode="a+", encoding="utf-8") # r+ a+ w+
# f.write("我要多寫一點內容. 然後爭取能看到效果")
# f.seek(0)
# print(f.read())
# f.seek(0)
# f.write("你")
#
# f.seek(0)
# print(f.read(1))
# f.seek(0)
# f.write("大米飯")
# f.write("大米粥")
# print(f.tell())
# f.seek(3) # 位元組
# print(f.read(1))
# # print(f.read(1)) # 字元
# # print(f.read(1)) # 字元
# print(f.tell()) #位元組
# 使用tell()可以知道游標在哪裡
# seek()可以移動游標
# 讀寫的時候. 單位 字元
# 游標: 單位是位元組
# 游標移動到末尾: seek(0,2)
# seek(偏移量, 位置)
# 位置: 0開頭, 1當前位置, 2末尾
# 移動到末尾: seek(0, 2)
11.truncate()
f = open("我的天吶", mode="r+", encoding="utf-8")
f.seek(9)
f.truncate(12) # 如果沒有引數. 按照游標來階段. 如果有引數. 截斷到引數位置
f.flush()
f.close()
12.修改檔案
import os # 引入os模組
with open("alex", mode="r", encoding="utf-8") as f1, \
open("alex_副本", mode="w", encoding="utf-8") as f2:
for line in f1:
new_line = line.replace("good", "sb")
f2.write(new_line)
os.remove("alex")
os.rename("alex_副本", "alex")
13.日誌處理
result = []
with open("2018-09-12.log", mode="r", encoding="utf-8") as f:
hang = f.readline()
title = hang.split("|")
for line in f:
line = line.strip() # 去掉空白, 2018-09-11 00:00:01|劉偉|吃雞
lst = line.split("|")
dic = {title[0]: lst[0], title[1]: lst[1], title[2]: lst[2]}
result.append(dic)
print(result)
14.其他
破檔案.txt:我是一個破檔案.fasdlkhfjasdkl
操作.py:
import requests # 網路請求
rs = requests.get("http://pic.netbian.com/uploads/allimg/180906/180605-153622836527b2.jpg")
f = open("桌布.jpg", mode="wb")
f.write(rs.content)
f.flush()
f.close()
2018-09-12.log.txt:
時間|名字|action
2018-09-11 00:00:01|劉偉|吃雞
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:01|劉偉|吃雞
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話
2018-09-11 00:00:02|darin|打電話