測開2 - Python(文件操作)

把第一次寫好漏掉的點寫在最前面:文件讀寫的內容都要求是字符串。

幾種文件操作的模式:

1. 'r',讀模式(默認模式),只能讀不能寫,文件不存在時報錯

2. 'w',寫模式,只能寫不能讀,文件不存在時會創建,但是存在時會先清空原文件內容

3.?'a',追加模式,增加新內容,不存在時會創建,但不能讀

4.?'r+',讀寫模式,能寫能讀,但文件不存在時會報錯

5.?'w+',寫讀模式,能讀能寫,文件不存在會創建,但文件存在時會先清空原文件內容

6.?'a+',追加讀模式,啥都能(能寫,即追加新內容,不存在會創建,能讀,不影響原內容)

總之,只要 r 相關的,不存在時都報錯,w 相關的,都會清空原文件內容,運用時可根據實際情況選擇模式。日常操作就是讀寫操作配合合適的模式。

?一、讀

read():?一次性獲取文件內容,返回值為 string

1 f = open('test.txt',encoding='utf-8')
2 result = f.read()    #獲取文件內容,read()方法一次性讀取所有內容
3 print(result)
4 
5 f.close()

readline(): 讀取一行

readlines(): 一次性讀取,并把文件內容存到 list 中,一行為一個元素

1 f = open('jlf.txt',encoding='utf-8')
2 result = f.readlines()
3 print(result)  #結果:['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f'],如果要去掉'\n',則需要用 strip() 方法
4 
5 f.close()    

?

二、寫

write:直接寫內容

writelines:循環把內容寫進文件,對象可以是字符串、列表,只要是能循環的都可以。

1 s='sdfasdf'
2 f = open('jlf.txt','w',encoding='utf-8')
3 
4 # for i in s:
5 #     f.write(i)
6 f.writelines(s)     #把 list 的內容循環寫進文件,與上一個注釋掉的方法效果相同
7 f.close()

?

三、文件指針

是用來指示文件操作的位置。讀模式下,指針在最前;寫模式下,因為會清空內容,所以也算是在前面;追加模式下,指針在最后。

?

四、文件中的其他方法(除了上面說過的讀和寫)

1     f = open('jlf.txt','r+',encoding='utf-8')#encoding參數可以指定文件的編碼
2     f.readable()#判斷文件是否可讀
3     f.writable()#判斷文件是否可寫
4     f.tell()#獲取當前文件的指針指向
5     f.seek(0)#把當前文件指針指向最前面
6     f.fulsh()#寫入文件后,立即從內存中把數據寫到磁盤中
7     f.truncate()#清空文件內容
8     f.writelines(['1','2'])#將一個列表寫入文件中
9     f.close()關閉文件

?

五、幾種高效的操作

1. 不用關閉文件的方式

為防止每次打開文件使用之后忘記關閉,有這樣一種方法,可以在你代碼運行完之后自動關閉文件,如下

1 with open('jlf.txt',encoding='utf-8') as f1,open('abc.txt','w',encoding='utf-8') as f2:
2     content = f1.read()
3     f2.write(content)
4     print(content)

2. 高效處理文件

在讀取文件內容的時候,如果用 read 或者 readlines,都會直接把所有內容讀取到內存,文件較大時可能直接導致內存不夠用機器卡死,所以這里給出一種比較高效的方式

1 with open('access.log',encoding='utf-8') as f:
2     for line in f:            #直接循環文件,一次讀一行
3         print('每次:',line)

?

六、修改文件

?1. 第一種屬于簡單直接粗暴的方式,適合小文件的處理,步驟如下

  - 先讀取內容

  - 替換內容

  - 清除原有內容

  - 寫進新內容

  例如:

1 f = open('jlf.txt','a+',encoding='utf-8')
2     f.seek(0)
3     results = f.read()
4     content = results.replace('xiaolan','dalan')
5     f.seek(0)
6     f.truncate()    #清空文件內容,或者用w模式再打開一次
7     f.write(content)
8 f.close()

  (這種的弊端其實寫在了上一條,高效處理文件的方法中,這種是把所有內容一次性拿來放在內存,改完之后再重新寫回文件)

2. 逐行處理

  - 打開 a 文件

  - 從 a 讀一行,修改,修改后寫到 b 文件里

  - 刪除 a 文件,把 b 重命名為 a

  例如:

1     with open('jlf.txt',encoding='utf-8') as f,open('aaaa.txt','w',encoding='utf-8') as f2:
2 
3         for line in f:
4         result = line.upper()
5         f2.write(result)
6 
7     import os
8     os.remove('jlf.txt')    #對文件的刪除和重命名操作需要放在文件關閉之后
9     os.rename('aaaa.txt','jlf.txt')

?

七、最后貼一個練習

?監控服務器日志,要求找出每分鐘訪問超過100次的 ip 地址

 1 import time
 2 point = 0    #用來標記下面文件讀取的位置,方便繼續讀取
 3 while True:    #自己再寫忘記循環
 4     with open('access.log',encoding='utf-8') as f:
 5         f.seek(point)
 6         ips = {}
 7         for line in f:
 8             if line.strip() != '':    #忘記處理空行
 9                 ip = line.split(‘ ’)[0]    #split后的()以一個空格分隔時,可以空著不寫(),也可以寫入一個空格(' ')
10                 if ip in ips.keys():
11                     ips[ip] += 1
12                 else:
13                     ips[ip] = 1
14         point = f.tell()
15         for k in ips:
16             if ips[k] >= 100:
17                 print('有問題的 ip 是:',k)    #自己寫時,輸出應為 ip,寫成了其對應的 key
18     time.sleep(60) 

?


八、json 操作

說白了 json 就是一個字符串。格式其實就是一個字典。
有的時候文件讀取過程中,文件內存的是json,剛好我們讀出來也需要轉成字典格式,那就需要有一種方法可以直接識別這種格式,json 模塊中剛好就帶了這樣的方法。
1.寫文件
import json
d = {"error_code": 0,"stu_info": [{"id": 314,"name": "礦泉水","sex": "","age": 18,"addr": "北京市昌平區","grade": "摩羯座","phone": "18317155663","gold": 100},{"id": 315,"name": "礦泉水","sex": "","age": 27,"addr": "上海","grade": "摩羯座","phone": "18317155664","gold": 100}]
}
with open('abc.txt','w',encoding='utf-8') as fw:#s = json.dumps(d,ensure_ascii=False,indent=4)    #把字典轉成json,字符串#fw.write(s)
    json.dump(d,fw,indent=4,ensure_ascii=False)
 

有兩種方法,dump 和 dumps。被注釋的兩行代碼中用了 dump,但兩行的作用相當于最后一行。也就是說,json 自帶了 dumps 方法可以直接拿到要寫入的對象,寫到目標文檔中。

2. 讀文件

1 import json
2 with open('abc.txt',encoding='utf-8') as fr:
3     result = json.load(fr)
4     print(type(result))

json.load() 方法,非常方便,直接返回一個字典。



轉載于:https://www.cnblogs.com/april-aaa/p/10939648.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386726.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386726.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用docker在CentOS7上搭建WordPress

前言 本文基于Centos 7 環境的docker搭建操作,centos 7 用 firewalld 替換了iptables作為默認防火墻操作,但以前習慣了iptables 就不與時俱進了。 環境準備 systemctl disable firewalld systemctl stop firewalld setenforce 0 sed -i "s/SELIN…

企業級應用,如何實現服務化一(項目架構演化)

1.企業級應用架構演化 1.1.架構演化圖 1.2.文字描述 #單一應用架構當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本#垂直應用架構當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小&#xff0c…

Alpine 操作系統是一個面向安全的輕型 Linux 發行版

Alpine 操作系統是一個面向安全的輕型 Linux 發行版。它不同于通常 Linux 發行版,Alpine 采用了 musl libc 和 busybox 以減小系統的體積和運行時資源消耗,但功能上比 busybox 又完善的多,因此得到開源社區越來越多的青睞。在保持瘦身的同時&…

ASP.NET MVC Filter過濾機制(過濾器、攔截器)

https://blog.csdn.net/knqiufan/article/details/82413885 本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/knqiufan/article/details/82413885參考文章:1、https://www.cnblogs.com/webapi/p/5669057.html 2、htt…

elk docker

換了個運行環境,重新搭建一套公司本地內部的ELK,之前也搭過(可訪問:https://yanganlin.com/31.html),最近做什么事情都想用Docker,這次也用Docker,還算順利,沒掉什么坑里,上次搭建,也用用的6.2的版本,這都過了一年,Elk這三個產品,都已經上7了,用docker搭建的還是用6.2.4,穩定不…

LeetCode Largest Number

1231231轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10954249.html

有個需求mybatis?插入的時候不知道有哪些字段,需要動態的傳入值和字段

有個需求mybatis 插入的時候不知道有哪些字段,需要動態的傳入值和字段, Java code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Test public void testAddProductGuaranty() { //1 560 50000 2014/10/2 0:00:00 2014/11/1 0…

readonly的用法

轉載于:https://www.cnblogs.com/w123w/p/10958567.html

mybatis insert 動態生成插入的列及插入的值

代碼如下 &#xff1a; 1.mapper.xml 文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper name…

loj2245 [NOI2014]魔法森林 LCT

[NOI2014]魔法森林 鏈接 loj 思路 a排序&#xff0c;b做動態最小生成樹。 把邊拆成點就可以了。 uoj98.也許lct復雜度寫假了、、越卡常&#xff0c;越慢 代碼 #include <bits/stdc.h> #define ls c[x][0] #define rs c[x][1] using namespace std; const int N 2e5 7; …

Jenkins發布spring boot到hub.Docker 方法

在生成的目錄下&#xff0c;建立個文件&#xff0c;文件名稱為&#xff1a;Dockerfile FROM java:8 VOLUME /tmp ADD target/assignment-0.0.1-SNAPSHOT.jar /dalaoyang.jar ENTRYPOINT ["java","-Djava.security.egdfile:/dev/./urandom","-jar&q…

網頁視頻直播、微信視頻直播技術解決方案:EasyNVR與EasyDSS流媒體服務器組合之區分不同場景下的直播接入需求...

背景分析 熟悉EasyNVR產品的朋友們都知道&#xff0c;EasyNVR不僅可以獨成體系&#xff0c;而且還可以跟其他系列產品相配合&#xff0c;形成各種不同類型的解決方案&#xff0c;滿足各種不同應用場景的實際需求。針對很多設備現場沒有固定公網IP&#xff0c;但是又想實現公網、…

如何解決VMware Workstation 10.0.0 build-1295980馬賽克現象

VMware Workstation 10.0.0 build-1295980偶爾出現客戶機馬賽克現象&#xff0c;可切換至其它選項卡&#xff0c;再切換回去即可。 還有一種方式是關閉加速3D圖形。 轉載于:https://www.cnblogs.com/rms365/p/10961499.html

不同賬號間的云資源授權方法

阿里云的訪問控制RAM產品可以實現資源的分配和授權,在一個特殊的業務背景下,資源也可以實現跨賬號的授權使用. 背景: 1.A公司,作為甲方Party A,出資購買云資源,對云資源具有所有權,但不實際管理,需要乙方配合. 2.B公司,作為乙方Party B,要管理A公司的云資源,需要A公司授權云資…

知乎上已獲千贊,全網獨家首發!

前言 選了開發這一行&#xff0c;就意味著想混得好就要持續學習&#xff0c;你的技術和薪資、位置直接掛鉤&#xff0c;進步對于程序員的重要性就不贅述了&#xff0c;接下來作為過來人&#xff0c;為廣大同行分享一些學習干貨&#xff0c;希望可以幫到大家 1、網絡 網絡協議…

知乎上已獲千贊,持續更新中

前言 不知不覺自己已經做了幾年開發了&#xff0c;由記得剛出來工作的時候感覺自己能牛逼&#xff0c;現在回想起來感覺好無知。懂的越多的時候你才會發現懂的越少。 如果你的知識是一個圓&#xff0c;當你的圓越大時&#xff0c;圓外面的世界也就越大。 最近看到很多Androi…

centos下搭建Jenkins持續集成環境(安裝jenkins)

centos下搭建Jenkins持續集成環境(安裝jenkins) 1、安裝JDK yum install -y java 2、安裝jenkins 添加Jenkins庫到yum庫&#xff0c;Jenkins將從這里下載安裝。 1 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo 2 rpm --import h…

elementUi Dialog 對話框使用中數據獲取問題

Dialog 對話框&#xff1a;使用中數據獲取問題演示代碼&#xff1a; <div class"centerContent"><ul><li class"contentBox" v-for"(notice,index) in systemNotices" :key"index"> //循環取值<div class&quo…

全志_功能引腳配置_sys_config.fex

\lichee\tools\pack\chips\sun8iw5p1\configs\vstar\sys_config.fex;---------------------------------------------------------------------------------------------------------————————; port configuration:; port_name port:GPIO<mux><pull up/down&…

離開小廠進大廠的第一周,BTAJ大廠最新面試題匯集,面試總結

大佬帶你走進Android開發的世界&#xff0c;掌握了這些知識點&#xff0c;學習Android也可以很輕松。 核心分析內容 對于怎么學習Android&#xff0c;主要解決的是3個問題&#xff1a;學什么、怎么學 & 怎么用。 具體如下&#xff1a; 下面&#xff0c;我將帶著上述幾個問…