第十一章 文件

第十一章 文件

打開文件

當前目錄中有一個名為beyond.txt的文本文件,打開該文件
調用open時,原本可以不指定模式,因為其默認值就是’r’。

import io
f = open('beyond.txt')

文件模式

描述
‘r’讀取模式(默認值)
‘w’寫入模式
‘x’獨占寫入模式
‘a’附加模式
‘b’二進制模式(與其他模式結合使用)
‘t’文本模式(默認值,與其他模式結合使用)
‘+’讀寫模式(與其他模式結合使用)

文件的基本方法

讀取和寫入

在當前路徑下創建一個beyond.txt文本文件,在該文本文件中寫入內容,并讀取出來。

import io
f = open('beyond.txt','w')
f.write("I like beyond band")#結果為:18
f.write("I like wsq")#結果為:10
f.close()

運行結果如下:在這里插入圖片描述

import io
f = open('beyond.txt','r')
f.read(4)#結果為:'I li'
f.read()#結果為:'ke beyond bandI like wsq'

首先,指定了要讀取多少(4)個字符。接下來,讀取了文件中余下的全部內容(不指定要讀取多少個字符)。

使用管道重定向輸出

在bash等shell中,可依次輸入多個命令,并使用管道將它們鏈接起來
$ cat beyond.txt | python somescript.py | sort

cat beyond.txt:將文件beyond.txt的內容寫入到標準輸出(sys.stdout)。

python somescript.py:執行Python腳本somescript。這個腳本從其標準輸入中讀取,并將結果寫入到標準輸出。

sort:讀取標準輸入(sys.stdin)中的所有文本,將各行按字母順序排序,并將結果寫入到標準輸出。

somescript.py從其sys.stdin中讀取數據(這些數據是beyond.txt寫入的),并將結果寫入到其sys.stdout(sort將從這里獲取數據)。

計算sys.stdin中包含多少個單詞的簡單腳本
somescript.py代碼如下:

# somescript.py
import systext = sys.stdin.read()
words = text.split()
wordcount = len(words)
print('Wordcount:',wordcount)

beyond.txt內容如下:

Yellow Skies, I can see the Yellow Skies.
See you again, I see you again
In my dreams, in my dreams, in my dreams, in my dreams.
Morning light, I remember morning light.
Outside my doors, I ll see you no more.
In my dreams, in my dreams, in my dreams, in my dreams
Forever, Forever Ill be forever holding you.
Forever, Forever Ill be forever holding you.
Responsible, Responsible, Responsible, Responsible.
So black and white,
Its become so black and white.

cat beyond.txt | python somescript.py

隨機存取
所有的文件都可以當成流來進行處理,可以在文件中進行移動,這稱為隨機存取。
可使用文件對象的兩個方法:seek 和 tell。

方法 seek(offset[, whence])將當前位置(執行讀取或寫入的位置)移到 offset 和whence 指定的地方。
參數 offset 指定了字節(字符)數
參數 whence 默認為 io.SEEK_SET(0),這意味著偏移量是相對于文件開頭的(偏移量不能為負數)。

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt','w')
f.write('beyondhelloword')#結果為:15
f.seek(5)#結果為:5
f.write('hello beyond')#結果為:12
f.read()#結果為:'beyonhello beyond'
#seek(5)此時的指向了d,再次進行write操作,則會覆蓋之后的所有
import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
f.read(3)#結果為:'bey'
f.read(2)#結果為:'on'
f.tell()#結果為:5
#這里的tell方法返回的是此時指向的位置

讀取和寫入行

讀取一行(從當前位置到下一個分行符的文本),可使用方法readline
可不提供任何參數(在這種情況下,將讀取一行并返回它)
也可提供一個非負整數,指定readline最多可讀取多少個字符。

方法writelines:接受一個字符串列表(實際上,可以是任何序列或可迭代對象),并將這些字符串都寫入到文件(或流)中。
寫入時不會添加換行符,因此你必須自行添加。另外,沒有方法writeline,因為可以使用write。

關閉文件

方法close將文件關閉
在python中運行的而結果會存入到緩沖區中,有可能沒有將結果給你進行立即返回,通常程序退出時將自動關閉文件對象,并將緩沖器的內容給返回。當然如果不想關閉文件,又想將緩沖器的內容及時得到,可以使用flush方法。

當然也可以使用try/finally語句,并在finally子句中調用close。

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt','w')
try:f.write('like wsq')
finally:f.close()

有一條專門為此設計的語句,那就是with語句,這樣是用的最多的方法

import io
with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt','w') as f:f.write('like qibao')   

上下文管理器
with語句實際上是一個非常通用的結構,允許你使用所謂的上下文管理器
上下文管理器是支持兩個方法的對象:__enter____exit__
方法__enter__不接受任何參數,在進入with語句時被調用,其返回值被賦給關鍵字as后面的變量。
方法__exit__接受三個參數:異常類型、異常對象和異常跟蹤。它在離開方法時被調用(通過前述參數將引發的異常提供給它)。如果__exit__返回False,將抑制所有的異常.

使用文件的基本方法

beyond.txt內容如下:

Yellow Skies, I can see the Yellow Skies.
See you again, I see you again
In my dreams, in my dreams, in my dreams, in my dreams.
Morning light, I remember morning light.
Outside my doors, I ll see you no more.
In my dreams, in my dreams, in my dreams, in my dreams
Forever, Forever Ill be forever holding you.
Forever, Forever Ill be forever holding you.
Responsible, Responsible, Responsible, Responsible.
So black and white,
Its become so black and white.

在這里插入圖片描述
read(n)

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
f.read(7)#結果為:'Yellow '
f.read(4)#結果為:'Skie'
f.close()

read()

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
print(f.read())#結果為:
'''
Yellow Skies, I can see the Yellow Skies.
See you again, I see you again
In my dreams, in my dreams, in my dreams, in my dreams.
Morning light, I remember morning light.
Outside my doors, I ll see you no more.
In my dreams, in my dreams, in my dreams, in my dreams
Forever, Forever Ill be forever holding you.
Forever, Forever Ill be forever holding you.
Responsible, Responsible, Responsible, Responsible.
So black and white,
Its become so black and white.
'''
f.close()

readline()

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
for i in range(3):print(str(i)+':'+f.readline(),end='')#結果為:
'''
0:Yellow Skies, I can see the Yellow Skies.
1:See you again, I see you again
2:In my dreams, in my dreams, in my dreams, in my dreams.
'''
f.close()

readlines()

import io
import pprint
pprint.pprint(open(r'E:\Jupyter_workspace\study\python\book\beyond.txt').readlines())#結果為:
'''
['Yellow Skies, I can see the Yellow Skies.\n','See you again, I see you again\n','In my dreams, in my dreams, in my dreams, in my dreams.\n','Morning light, I remember morning light.\n','Outside my doors, I ll see you no more.\n','In my dreams, in my dreams, in my dreams, in my dreams\n','Forever, Forever Ill be forever holding you.\n','Forever, Forever Ill be forever holding you.\n','Responsible, Responsible, Responsible, Responsible.\n','So black and white,\n','Its become so black and white.']
'''
#這里利用了文件對象將被自動關閉這一事實。

write(string)

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt','w')
f.write('I\nlike\nwsq\n')#結果為:11
f.close()

在這里插入圖片描述

writelines(list)

import io
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
lines = f.readlines()
f.close()
lines[1] = "am\n"
f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt', 'w')
f.writelines(lines)
f.close()

在這里插入圖片描述

迭代文件內容

在這里插入圖片描述
使用read遍歷字符

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:char = f.read(1)while char:beyond(char)char = f.read(1)
'''
words is: I
words is: words is: a
words is: m
words is: words is: w
words is: s
words is: q
words is: 
'''
'''
這個程序之所以可行,是因為到達文件末尾時,方法read將返回一個空字符串,
但在此之前,返回的字符串都只包含一個字符(對應于布爾值True)。
只要char為True,你就知道還沒結束。
'''

以不同的方式編寫循環

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:while True:char = f.read(1)if not char:breakbeyond(char)'''
words is: I
words is: words is: a
words is: m
words is: words is: w
words is: s
words is: q
words is: 
'''

每次一行
處理文本文件時,通常想做的是迭代其中的,而不是每個字符。
方法readline,可像迭代字符一樣輕松地迭代行。

在while循環中使用readline

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:while True:line = f.readline()if not line:breakbeyond(line)'''
words is: Iwords is: amwords is: wsq
'''

讀取所有內容

使用read迭代字符

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:for char in f.read():beyond(char)
'''
words is: I
words is: words is: a
words is: m
words is: words is: w
words is: s
words is: q
words is: 
'''

使用readlines迭代行

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:for line in f.readlines():beyond(line)'''
words is: Iwords is: amwords is: wsq
'''

使用fileinput實現延遲行迭代

有時候需要迭代大型文件中的行,此時使用readlines將占用太多內存。
在Python中,在可能的情況下,應首選for循環。
可使用一種名為延遲行迭代的方法——說它延遲是因為它只讀取實際需要的文本部分。

使用fileinput迭代行

import fileinput
import io
def beyond(string):print("words is:",string)for line in fileinput.input(r'E:\Jupyter_workspace\study\python\book\beyond.txt'):beyond(line)
'''
words is: Iwords is: amwords is: wsq
'''

文件迭代器

迭代文件

import io
def beyond(string):print("words is:",string)with open(r'E:\Jupyter_workspace\study\python\book\beyond.txt') as f:for line in f:beyond(line)'''
words is: Iwords is: amwords is: wsq
'''

在不將文件對象賦給變量的情況下迭代文件

import io
def beyond(string):print("words is:",string)for line in open(r'E:\Jupyter_workspace\study\python\book\beyond.txt'):beyond(line)
'''
words is: Iwords is: amwords is: wsq
'''

與其他文件一樣,sys.stdin也是可迭代的

import sys
import io
def beyond(string):print("words is:",string)for line in sys.stdin:beyond(line)

對迭代器做的事情基本上都可對文件做

f = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt', 'w') 
print('First', 'line', file=f)
print('Second', 'line', file=f)
print('Third', 'and final', 'line', file=f)
f.close()
lines = list(open(r'E:\Jupyter_workspace\study\python\book\beyond.txt'))
lines#結果為:['First line\n', 'Second line\n', 'Third and final line\n']first, second, third = open(r'E:\Jupyter_workspace\study\python\book\beyond.txt')
first#結果為:'First line\n'
second#結果為:'Second line\n'
third#結果為:'Third and final line\n'

在這里插入圖片描述
注意:
1,使用了print來寫入文件,這將自動在提供的字符串后面添加換行符。
2,對打開的文件進行序列解包,從而將每行存儲到不同的變量中。
3,寫入文件后將其關閉,以確保數據得以寫入磁盤。

小結

概念描述
類似于文件的對象類似于文件的對象是支持read和readline(可能還有write和writelines)等方法的對象。
打開和關閉文件要打開文件,可使用函數open,并向它提供一個文件名。如果要確保即便發生錯誤時文件也將被關閉,可使用with語句。
模式和文件類型打開文件時,還可指定模式,如’r’(讀取模式)或’w’(寫入模式)通過在模式后面加上’b’,可將文件作為二進制文件打開,并關閉Unicode編碼和換行符替換。
標準流三個標準流(模塊sys中的stdin、stdout和stderr)都是類似于文件的對象,它們實現了UNIX標準I/O機制(Windows也提供了這種機制)。
讀取和寫入要從文件或類似于文件的對象中讀取,可使用方法read;要執行寫入操作,可使用方法write。
讀取和寫入行要從文件中讀取行,可使用readline和readlines;要寫入行,可使用writelines。
迭代文件內容迭代文件內容的方法很多,其中最常見的是迭代文本文件中的行,這可通過簡單地對文件本身進行迭代來做到。還有其他與較舊Python版本兼容的方法,如使用readlines。

本章介紹的新函數

函數描述
open(name, …)打開文件并返回一個文件對象

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

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

相關文章

iterator與iterable

用Iterator模式實現遍歷集合Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引: for(i…

Android中的Touch事件處理流程

1、當觸摸屏幕時,最先執行的是Activity中的 publicbooleandispatchTouchEvent (MotionEvent ev) {if(ev.getAction() MotionEvent. ACTION_DOWN) {onUserInteraction();}if(getWindow().superDispatchTouchEvent(ev)) {returntrue;}returnonTouchEvent(ev);}如果某…

【TensorFlow學習筆記:神經網絡八股】(實現MNIST數據集手寫數字識別分類以及FASHION數據集衣褲識別分類)

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言一、搭建網絡八股sequential1.函數介紹2.6步法實現鳶尾花分類二、搭建網絡八股class1.創建自己的神經網絡模板:2.調用自己創建的model對象三、MNIST數據集1.用sequential搭建網絡實現手寫數字識別2.用…

c語言 在執行區域沒有空格,C語言上機操作指導之TurboC.doc

C語言上機操作指導之 -------- Turbo C程序設計是實踐性很強的過程,任何程序都必須在計算機上運行,以檢驗程序的正確與否。因此在學習程序設計中,一定要重視上機實踐環節,通過上機可以加深理解 C語言的有關概念,以鞏固…

java 根據類名示例化類_Java即時類| from()方法與示例

java 根據類名示例化類即時類from()方法 (Instant Class from() method) from() method is available in java.time package. from()方法在java.time包中可用。 from() method is used to return a copy of the Instant from the given TemporalAccessor object. from()方法用于…

第十二章 圖形用戶界面

第十二章 圖形用戶界面 GUI就是包含按鈕、文本框等控件的窗口 Tkinter是事實上的Python標準GUI工具包 創建GUI示例應用程序 初探 導入tkinter import tkinter as tk也可導入這個模塊的所有內容 from tkinter import *要創建GUI,可創建一個將充當主窗口的頂級組…

Sqlserver 2005 配置 數據庫鏡像:數據庫鏡像期間可能出現的故障:鏡像超時機制

數據庫鏡像期間可能出現的故障 SQL Server 2005其他版本更新日期: 2006 年 7 月 17 日 物理故障、操作系統故障或 SQL Server 故障都可能導致數據庫鏡像會話失敗。數據庫鏡像不會定期檢查 Sqlservr.exe 所依賴的組件來驗證組件是在正常運行還是已出現故障。但對于某…

江西理工大學期末試卷c語言,2016年江西理工大學信息工程學院計算機應用技術(加試)之C語言程序設計復試筆試最后押題五套卷...

一、選擇題1. 設有函數定義:( )。A. B. C. D. 答:A則以下對函數sub 的調用語句中,正確的是【解析】函數的參數有兩個,第一個是整型,第二個是字符類型,在調用函數時,實參必須一個是整型&#xff…

第十三章 數據庫支持

第十三章 數據庫支持 本章討論Python數據庫API(一種連接到SQL數據庫的標準化方式),并演示如何使用這個API來執行一些基本的SQL。最后,本章將討論其他一些數據庫技術。 關Python支持的數據庫清單 Python數據庫API 標準數據庫API…

【神經網絡八股擴展】:自制數據集

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言1、文件一覽2、將load_data()函數替換掉2、調用generateds函數4、效果總結前言 本講目標:自制數據集,解決本領域應用 將我們手中的圖片和標簽信息制作為可以直接導入的npy文件。 1、文件一覽 首先看…

java 批量處理 示例_Java中異常處理的示例

java 批量處理 示例Here, we will analyse some exception handling codes, to better understand the concepts. 在這里,我們將分析一些異常處理代碼 ,以更好地理解這些概念。 Try to find the errors in the following code, if any 嘗試在以下代碼中…

hdu 1465 不容易系列之一

http://acm.hdu.edu.cn/showproblem.php?pid1465 今天立神和我們講了錯排,才知道錯排原來很簡單,從第n個推起: 當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用M(n)表示,那么M(n-1)就表示n-1個編號元素放在n-1個編號位置…

第十四章 網絡編程

第十四章 網絡編程 本章首先概述Python標準庫中的一些網絡模塊。然后討論SocketServer和相關的類,并介紹同時處理多個連接的各種方法。最后,簡單地說一說Twisted,這是一個使用Python編寫網絡程序的框架,功能豐富而成熟。 幾個網…

c語言輸出11258循環,c/c++內存機制(一)(轉)

一:C語言中的內存機制在C語言中,內存主要分為如下5個存儲區:(1)棧(Stack):位于函數內的局部變量(包括函數實參),由編譯器負責分配釋放,函數結束,棧變量失效。(2)堆(Heap):由程序員用…

【神經網絡八股擴展】:數據增強

課程來源:人工智能實踐:Tensorflow筆記2 文章目錄前言TensorFlow2數據增強函數數據增強網絡八股代碼:總結前言 本講目標:數據增強,增大數據量 關于我們為何要使用數據增強以及常用的幾種數據增強的手法,可以看看下面的文章&#…

C++:從C繼承的標準庫

C從C繼承了的標準庫 &#xff0c; 這就意味著 C 中 可以使用的標準庫函數 在C 中都可以使用 &#xff0c; 但是需要注意的是 &#xff0c; 這些標準庫函數在C中不再以 <xxx.h> 命名 &#xff0c; 而是變成了 <cxxx> 。 例如 &#xff1a; 在C中操作字符串的…

分享WCF聊天程序--WCFChat

無意中在一個國外的站點下到了一個利用WCF實現聊天的程序&#xff0c;作者是&#xff1a;Nikola Paljetak。研究了一下&#xff0c;自己做了測試和部分修改&#xff0c;感覺還不錯&#xff0c;分享給大家。先來看下運行效果&#xff1a;開啟服務&#xff1a;客戶端程序&#xf…

c# uri.host_C#| 具有示例的Uri.Equality()運算符

c# uri.hostUri.Equality()運算符 (Uri.Equality() Operator) Uri.Equality() Operator is overloaded which is used to compare two Uri objects. It returns true if two Uri objects contain the same Uri otherwise it returns false. Uri.Equality()運算符已重載&#xf…

第六章至第九章的單元測試

1,?助劑與纖維作用力大于纖維分子之間的作用力,則該助劑最好用作() 纖維增塑膨化劑。 2,助劑擴散速率快,優先占領纖維上的染座,但助劑與纖維之間作用力小于染料與纖維之間作用力,該助劑可以作為() 勻染劑。 3,助劑占領纖維上的染座,但助劑與纖維之間作用力大于染…

【神經網絡擴展】:斷點續訓和參數提取

課程來源&#xff1a;人工智能實踐:Tensorflow筆記2 文章目錄前言斷點續訓主要步驟參數提取主要步驟總結前言 本講目標:斷點續訓&#xff0c;存取最優模型&#xff1b;保存可訓練參數至文本 斷點續訓主要步驟 讀取模型&#xff1a; 先定義出存放模型的路徑和文件名&#xff0…