python -- 文件操做

1、文件操做
   一、 open 打開
    f = open(文件路徑,mode = 」模式「,encoding = 」編碼格式「)最底層的操做就是bytes
    encoding 表示編碼集,根據文件的實際保存編碼進行獲取數據,對於咱們而言更多的是utf-8,記事本的編碼格式是GBK。
    打開一個文件時,獲取到的是一個文件句柄。經過文件句柄就能夠對文件進行操做了,根據打開方式不一樣,可以執行的操做也會有相應的差別。
# r : read 只讀
f = open("大猩猩.txt",mode = "r", encoding = "utf-8")
# 讀取內容
f1 = f.read() # 所有都讀取出來
print(f)
f2 = f.read() # 讀取不到內容,上邊已經讀取完畢,光標在末尾
print(f2)
# 關閉鏈接
f.close()
  相對路徑: 相對於當前目錄所存在的文件夾
                      ../          上一層文件
                     文件夾/    進入xxx文件夾
       絕對路徑: 從磁盤根目錄開始一直到文件名。
 
 推薦使用相對路徑,在咱們把程序拷貝給別人的時候,直接把項目拷貝走就能運行,但若是是絕對路徑,還須要拷貝用到的外部文件。
 
    日誌:程序運行過程當中記錄得信息。通常保存在絕對路徑。
 
二、mode (模式)
    
    r : 讀取,只讀
 
            讀取文件的方式
                  一、read()   默認讀取文件的所有內容。弊端:佔內存。若是文件過大,容易致使內存奔潰。
                  二、read(n)  讀取n個 字符。注:若是再次讀取,會在當前位置繼續去讀,而不死從頭再讀。
                  三、readline() 一次讀取一行數據。  注:readline()結尾,每次讀取的數據都會有一個  \n 結尾,須要使用strip()方法去    
                        掉 \n 或者空格
                  四、readlines() 將每一行造成一個元素,放到一個列表中,將全部的內容都讀取出來。文件過大時,容易內存崩潰。
                  五、循環讀取。最重要,最好用。每次讀取一行內容。不會產生內存溢出的問題 
                         for  line in f:
 
                注:讀取完的文件句柄必定要關閉  f.close()
 
 
  w:  寫,只是寫
  
         寫的時候,若是沒有文件,則會建立文件;若是文件存在,則將原件中原來的內容刪除,再寫入新的內容
         寫入完成後,須要刷新管道 f.flush()  
f = open('夢想', mode = 'w', encoding = 'utf-8')
f.write('好聲音\n')
f.write('奇葩說\n')
f.write('邏輯思惟')
f1 = f.read()
print(f1)   # 報錯:not readable
f.flush()
f.close()
a : 
 
            將內容追加寫到末尾,也能夠建立文件
f = open('心門', mode = 'a', encoding = 'utf-8')
f.write('好聲音\n')
f.write('奇葩說\n')
f.write('邏輯思惟')
f.flush()
f.close()
r+ :
 
        讀寫,先讀後寫,使用頻率比較高。
        注:不論讀取內容的是多少,只要讀了,寫入就是從末尾開始。
 
w+:
 
         開始就是清空文件。通常不會用
 
 全部帶b 的表示直接操做的時bytes,處理非文本文件的時候。
 rb
 wb
 
 ab:斷點續傳, 好比在下載文件的時候中斷,下次下載的時候,從斷點,繼續下載。
 
 a+: 追加讀,不管是先讀仍是後讀,都讀取不到數據。
 
 r + b   w + b   a +b    寫病毒的時候能夠用到。
 
 
三、文件操做中關於句柄的相關操做
 
  seek()  移動光標
  f.seek(0)  移動到開頭
  f.seek(0,2)  移動到末尾
  seek 的兩個參數: 一、表示偏移量   二、從xxx開始偏移,默認位0,指開頭。 1,指當前位置   2,末尾
 注: 移動的單位都是bytes,因此若是是utf-8的中文部分要是3的倍數。
 
  tell()  返回光標所在的位置
 
 truncate(canshu)
 
        一、若是給了參數,從頭截取到參數位置
        二、若是不給參數,從頭截取到光標
 
 
四、修改文件中的字段
步驟:
    一、先從文件中讀取內容
    二、把要修改的內容進行修改
    三、把修改好的內容寫到一個新文件
    四、刪除掉原來的文件
    五、把新文件重命名成原來的文件名
import os
f1 = open('心門', mode='r', encoding='utf-8')
f2 = open('心門_副本', mode='w', encoding='utf-8')

for line in f1:
if '' in line:
line = line.replace('','真的很是好,及其好')
f2.write(line)
f1.close()
f2.flush()
f2.close()
# time.sleep(3)
# 刪除源文件
os.remove("心門")
# 將新的文件重命名爲原來的文件
os.rename('心門_副本','心門')

 

import os
with open('心門', mode='r',encoding='utf-8') as f1 ,\
open('心門_副本', mode='w',encoding='utf-8') as f2:
for line in f1:
if '' in line:
line = line.replace('','真的很是好,及其好')
f2.write(line)

# time.sleep(3)

os.remove('心門')
os.rename('心門_副本','心門')

 

a1.txt  內容以下:

name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013
name:mac price:3000 amount:2 year:2014
name:lenovo price:30000 amount:3 year:2015
name:chicken price:10 amount:3 year:2016

經過代碼,將其構建成這種數據類型:
[{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}......]
並計算出總價錢。
'''
with open('a2.txt', mode='r', encoding='utf-8') as f:
    lst = []
    sum = 0
    for line in f:
        line = line.strip().split(' ')
        dic = {}
        for c in line:
            c = c.split(':')
            if c[0] =='price' or c[0] =='amount':
                dic[c[0]] = int(c[1])
            else:
                dic[c[0]] = c[1]
        sum += dic["price"] * dic["amount"]
        lst.append(dic)
print(lst)
print(sum)
相關文章
相關標籤/搜索