Python之路----文件操作

来源:http://www.cnblogs.com/yangxiaoling/archive/2016/08/28/5814548.html
-Advertisement-
Play Games

文件操作 1.能調用方法的一定是對象,比如數值、字元串、列表、元組、字典,甚至文件也是對象,Python中一切皆為對象。 2.三種基本的文件操作模式:r(only-read)、w(only-write)、a(append) 對文件進行操作的流程:第一,建立文件對象。第二,調用文件方法進行操作。第三, ...


文件操作

1.能調用方法的一定是對象,比如數值、字元串、列表、元組、字典,甚至文件也是對象,Python中一切皆為對象。

1 str1 = 'hello'
2 str2 = 'world'
3 str3 = ' '.join([str1,str2])
4 print(str3)

2.三種基本的文件操作模式:r(only-read)、w(only-write)、a(append)

  對文件進行操作的流程:第一,建立文件對象。第二,調用文件方法進行操作。第三,不要忘了關閉文件。(文件不關閉的情況下,內容會放在緩存,雖然Python會在最後自動把內容讀到磁碟,但為了以防萬一,要養成關閉文件的習慣)

有文件file1

1 一張褪色的照片,
2 好像帶給我一點點懷念。
3 巷尾老爺爺賣的熱湯麵,
4 味道瀰漫過舊舊的後院;
5 流浪貓睡熟在搖晃鞦韆,
6 夕陽照了一遍他咪著眼;
7 那張同桌寄的明信片,
8 安靜的躺在課桌的裡面。

(1)r模式

  在只讀模式下寫入內容會報錯。

1 f = open('file1','r')
2 f_read = f.read()      #read是逐字元地讀取,read可以指定參數,設定需要讀取多少字元,無論一個英文字母還是一個漢字都是一個字元。
3 print(f_read)
4 f.close()
1 f = open('file1','r')
2 f_read = f.readline()  #readline只能讀取第一行代碼,原理是讀取到第一個換行符就停止。
3 print(f_read)
4 f.close()
1 f = open('file1','r')
2 f_read = f.readlines()  #readlines會把內容以列表的形式輸出。
3 print(f_read)
4 f.close()
1 f = open('file1','r')
2 for line in f.readlines()  #使用for迴圈可以把內容按字元串輸出。
3     print(line)  #輸出一行內容輸出一個空行,一行內容一行空格...  因為文件中每行內容後面都有一個換行符,而且print()語句本身就可以換行,如果不想輸出空行,就需要使用下麵的語句:print(line.strip())
4 f.close()

(2)w模式

  在進行操作前,文件中所有內容會被清空。比如在file1中寫入'hello world',程式執行後file1中就只剩下一句'hello world'

1 f = open('file1','w',encoding='utf8')   #由於Python3的預設編碼方式是Unicode,所以在寫入文件的時候需要調用utf8,以utf8的方式保存,這時pycharm(預設編碼方式是utf8)才能正確讀取,當讀取文件時,文件是utf8格式,pycharm也是utf8,就不需要調用了。
2 f_w = f.write('hello world')
3 print(f_w)   #有意思的是,這裡並不列印'hello world',只列印寫入多少字元
4 f.close()

(3)a模式

  與w模式不同的是,a模式不會把原來內容清空,而是游標移到內容最後位置,繼續寫入新內容。比如在最後追加'hello world'

1 f = open('file1','a')
2 f_a = f.write('hello world')
3 print(f_a)  #還是會列印寫入的字元數
4 f.close()

列印文件,在'流浪貓睡熟在搖晃鞦韆'後面加上'helloworld'輸出

  r模式時,我們說過用for迴圈和readlines()輸出文件內容,這種輸出內容的原理是:打開文件,把全部內容讀入記憶體,然後再列印輸入,當文件很大時,這種讀取方式就不靠譜了,甚至會使機器崩潰。我們需要及時關閉文件,如下:

 1 f = open('file','r')
 2 data=f.readlines()    #註意及時關閉文件
 3 f.close()
 4 
 5 num = 0
 6 for i in data:
 7     num += 1
 8     if num == 5:
 9         i = ''.join([i.strip(),'hello world'])  #不要使用“+”進行拼接
10     print(i.strip())
11 f.close()

對於大數據文件,要使用下麵的方法:

1 num = 0
2 f.close()   #不要過早關閉文件,否則程式不能識別操作句柄f.
3 f = open('file','r')
4 for i in f:   #for內部把f變為一個迭代器,用一行取一行。
5     num += 1
6     if num == 5:
7         i = ''.join([i.strip(),'hello world'])
8     print(i.strip())
9 f.close()

3.tell和seek

tell:查詢文件中游標位置

seek:游標定位

 1 f = open('file','r')
 2 print(f.tell())   #游標預設在起始位置
 3 f.seek(10)        #把游標定位到第10個字元之後
 4 print(f.tell())   #輸出10
 5 f.close()
 6 ----------------------
 7 f = open('file','w')
 8 print(f.tell())   #先清空內容,游標回到0位置
 9 f.seek(10)        
10 print(f.tell())
11 f.close()
12 ----------------------
13 f = open('file','a')
14 print(f.tell())   #游標預設在最後位置
15 f.write('你好 世界'16 print(f.tell())   #游標向後9個字元,仍在最後位置
17 f.close()

4.flush 同步將數據從緩存轉移到磁碟

示例,實現進度條功能

 1 import sys,time   #導入sys和time模塊
 2 for i in range(40):
 3     sys.stdout.write('*')
 4     sys.stdout.flush()    #flush的作用相當於照相,拍一張沖洗一張
 5     time.sleep(0.2)
 6 下麵代碼也能夠實現相同的功能
 7 import time 
 8 for i in range(40):
 9     print('*',end='',flush=True)  #print中的flush參數
10     time.sleep(0.2)

5.truncate 截斷

不能是r模式下執行,

w模式下,已經清空所有數據,使用truncate沒有任何意義,

a模式下,截斷指定位置後的內容。

1 f = open('file','a')
2 f.truncate(6)  #只顯示6個位元組的內容(6個英文字元或三個漢字),後面的內容被清空。

6.游標位置總結

  一個漢字兩個位元組,涉及游標位置的方法有4個:read、tell、seek、truncate。

 1 #--------------------------游標總結head-----------------------------------
 2 f = open('file','r')
 3 print(f.read(6))  #6個字元
 4 print(f.tell())   #位置12位元組,一個漢字兩個位元組
 5 f.close()
 6 
 7 f = open('file','r')
 8 f.seek(6)           #6個位元組
 9 print(f.tell())
10 f.close()
11 
12 f = open('file','a')
13 print(f.tell())   #游標預設在最後位置
14 f.write('你好 世界')
15 print(f.tell())   #游標向後9個位元組,一個漢字兩個位元組,仍在最後位置  182-->191
16 f.close()
17 
18 f = open('file','a',encoding='utf-8')
19 print(f.truncate(6))  #由於需要游標定位位置,所以也是位元組。只顯示6個位元組的內容(6個英文字母或三個漢字,一個漢字兩個位元組),後面的內容被清空。
20 f.close()
21 #-----------------------------游標總結end---------------------------------

 7.另外3種模式:r+、w+、a+

r+:讀寫模式,游標預設在起始位置,當需要寫入的時候,游標自動移到最後

w+:寫讀模式,先清空原內容,再寫入,也能夠讀取

a+:追加讀模式,游標預設在最後位置,直接寫入,也能夠讀取。

 1 f = open('file','a')
 2 print(f.tell())   #末尾207位置
 3 f.close()
 4 
 5 f = open('file','r+')
 6 print(f.tell())    #0位置
 7 print(f.readline())  #讀取第一行
 8 f.write('羊小羚')     #游標移到末尾207位置並寫入
 9 print(f.tell())   #213位置
10 f.seek(0)         #游標移到0位置
11 print(f.readline())   #讀取第一行
12 f.close()

8.修改文件內容

  思路:由於數據存儲機制的關係,我們只能把文件1中的內容讀取出來,經過修改後,放到文件2中。

 1 f2 = open('file2','w',encoding='utf8')   #寫入的時候必須加utf8
 2 f1 = open('file','r')
 3 num = 0
 4 for line in f1:  #迭代器
 5     num += 1
 6     if num == 5:
 7         line = ''.join([line.strip(),'羊小羚\n'])   #裡面就是對字元串進行操作了
 8     f2.write(line)
 9 f1.close()
10 f2.close()

9.with語句

  可以同時對多個文件同時操作,當with代碼塊執行完畢時,會自動關閉文件釋放記憶體資源,不用特意加f.close(),我們通過下麵的示例體會with的用法和好處。

  用with語句重寫8中的代碼

1 num = 0
2 with open('file','r') as f1,open('file2','w',encoding='utf8') as f2:
3     for line in f1:
4         num += 1
5         if num == 5:
6             line = ''.join([line.strip(),'羊小羚'])
7         f2.write(line)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先看一下文件,在當前包下有一個properties配置文件,在根目錄下有一個lib文件夾,裡面放的是mySql的驅動jar包 Driver :是一個介面,資料庫廠商必須提供實現的介面,能從其中獲取資料庫連接 可以通過Driver的實現類的對象獲取資料庫連接 * 1.加入mySql驅動 * 1.1 解 ...
  • 一、MyBaris簡介 1)MyBaris發展過程 MyBatis的前身叫iBatis,本是apache的一個開源項目, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis。 MyBatis是支持普通SQL查詢,存儲過程 ...
  • (一) 接需求 : 需求相關 (貼圖 ) 生成三核對文件 1、新增三核對菜單頁面中,增加生成三核對文件功能按鈕,彈窗可根據變電站、電壓等級查詢定值單。 2、定值單信息以表格形式展示,根據選擇情況,生成三核對文件。 整體就是這樣的一個需求,分sheet,合併單元格,設置各種單元格格式,要有序號。 (二 ...
  • Mybatis是輕量級的持久化框架,的確上手非常快. Mybatis大體上的思路就是由一個總的config文件配置全局的信息,比如mysql連接信息等。然後再mapper中指定查詢的sql,以及參數和返回值。 在Service中直接調用這個mapper即可。 依賴的jar包 主要的mybatis配置 ...
  • ...
  • JPA規範推薦使用Annotation來管理實體類與數據表之間的映射關係,從而避免同時維護兩份文件(Java 實體類 和 XML 映射文件),將映射信息(寫在Annotation中)與實體類集中在一起。 以下我將使用eclipse來構建一個簡單使用註解取代*.hbm.xml的查詢小例子。(p.s 建 ...
  • 首先需要導入包 然後寫方法,由於我使用的框架全部是spring 此處我只寫入實現層和控制層代碼 其中有個selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, ...
  • 應對場景: 相對於開發在一臺電腦上運行的單個程式,如何讓一個應用中的多個獨立的程式協同工作是一件非常困難的事情。開發這樣的應用,很容易讓很多開發人員陷入如何使多個程式協同工作的邏輯中,最後導致沒有時間更好地思考和實現他們自己的應用程式邏輯;又或者開發人員對系統邏輯關註不夠,只是用很少的時間開發了一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...