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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...