1. 程式人生 > >008-2018-09-12 檔案操作

008-2018-09-12 檔案操作

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|打電話