python素材和代码_python之文件和素材
11.1 打開文件
open函數
open(name[,mode[,buffering]])
>>>f = open(r'C:\text\somefile.txt')
11.1.1 文件模式
open函數中模式參數的常用值
'r'讀模式
'w'寫模式
'a'追加模式
'b'二進制模式
'+'讀/寫模式
通過在模式參數中使用U參數能夠在打開文件時使用通用的換行符支持模式,在這種模式下,所有的換行符/字符串(\r\n,\r或者是\n)都被轉換成\n,而不用考慮運行的平臺。
11.1.2 緩沖
open函數的第三個參數控制者文件的緩沖。如果參數是0或者False,I/O無緩沖的;如果是1或者True,就是有緩沖,大于1的數字代表緩沖區的大小,-1代表使用默認的緩沖區大小
11.2 基本文件方法
三種標準的流
數據輸入得標準源是sys.stdin。
要打印的文本保存在sys.stdout內。
錯誤信息被寫入sys.stderr.
11.2.1 讀和寫
文件最重要的能力是提供或者接受數據。如果一個名為f的類文件對象,那么就可以用f.write方法和f.read方法寫入和讀取數據。
每次調用f.write(string)時,所提供的參數string會被追加到文件中已存在部分的后面。
>>>f = open('somefile.txt','w')
>>>f.write('Hello, ')
>>>f.write('world!')
>>>f.close()
在完成了對一個文件的操作時,調用close。
例子:接上例:
>>>f = open('somefile.txt','r')
>>>f.read(4)
'Hello'
>>>f.read()
'o.World!'
首先指定了我要讀取的字符數“4”,然后讀取了剩下的文件。注意,在調用open時可以省略模式說明,因為'r'是默認的。
11.2.2 管式輸出
$cat somefile.txt | python somescript.py | sort
somescript.py會從它的sys.stdin中讀取數據(cat somefile.txt寫入的),并把結果寫入它的sys.stdout中。
統計sys.stdin中單詞數的簡單腳本
#somescript.py
import sys
text = sys.stdin.read()
words = text.split()
wordcount = len(words)
print 'Wordcount:',wordcount
可以用類文件對象seek和tell來直接訪問感興趣的部分(這種做法稱為 隨機訪問)
seek(offset[,whence]):這個方法把當前位置移到由offest定義的位置。whence.offset是一個字節數,whence默認為0,也就是說偏移量是從文件開頭開始計算的。whence可能被設置為1或者2
>>>f = open(r'c:\text\somefile.txt','w')
>>>f.write('01234567890123456789')
>>>f.seek(5)
>>>f.write('Hello,world!')
>>>f.close()
>>>f = open(r'c:\text\somefile.txt')
>>>f.read()
'01234Hello,world!89'
tell方法返回當前文件的位置如下:
>>>f = open(r'c:\text\somefile.txt')
>>>f.read(3)
'012'
>>>f.read(2)
'34'
>>>f.tell()
5L
11.2.3 讀寫行
逐個字符讀取文件也是沒問題的,進行逐行的讀取也可以。還可以使用file.readline讀取單獨的一行。不使用任何參數或者使用一個非負的整數作為readline可以讀取的字符的最大值。因此,如果someFile.readline()返回‘Hello,World!\n’,someFile.readline(5)返回‘Hello’。readlines方法可以讀取一個文件中的所有行并將其作為列表返回。
writelines方法和readlines相反:傳給它的一個字符串的列表,它會把所有的字符串寫入文件。注意,程序不會增加新行,需要自己添加。沒有writeline方法,因為能使用write。
11.2.3 關閉文件
如果想確保文件被關閉了,那么應該使用try/finally語句,并且在finally子句中調用close方法。
#Open your file here
try:
#Write data to your file
finally:
file.close()
事實上,有專門為這種情況設計的語句,with語句:
with open("somefile.txt") as somefile:
do_something(somefile)
with語句可以打開文件并且將其賦值到變量上。之后就可以將數據寫入語句體中的文件。文件在語句結束后會被自動關閉,即使是由于異常引起的結束也是如此。
在python 2.5 中,with語句只有在導入如下的模塊后才可以用:
from __future__ import with_statement
直到關閉文件才會寫入文件。如果想繼續使用文件,又想將磁盤上的文件進行更新,以反映這些修改,那么需要調用文件對象的flush方法。
上下文管理器
with語句實際上是很通用的結構,允許使用所謂的上下文管理器。上下文管理器是一種支持__enter__ 和__exit__ 方法的對象。
__enter__方法不帶參數,它在進入with語句塊的時候被調用,返回值綁定到在as關鍵字之后的變量。
__exit__方法帶有3個參數:異常類型、異常對象和異?;厮?。在離開方法時這個函數被調用。如果__exit__返回false,那么所有的異常都不會被處理。它們的__enter__方法返回文件對象本身,__exit__方法關閉文件。
11.2.5 使用基本文件方法
一個簡單文本文件
Welcome to this file
There is nothing here except
This stupid haiku
首先是read(n):
>>>f = open(r'c:\text\somefile.txt')
>>>f.read(7)
'Welcome'
>>>f.read(4)
'to'
>>>f.close()
然后是read():
>>>f = open(r'c:\text\somefile.txt')
>>>print f.read()
Welcome to this file
There is nothing here except
This stupid haiku
>>>f.close()
接著是readline():
>>>f = open(r'c:\text\somefile.txt')
>>>for i in range(3):
print str(i) + ': ' + f.readline(),
0:Welcome to this file
1:There is nothing here except
2:This stupid haiku
>>>f.close()
以及readlines():
>>import pprint
>>>pprint.pprint(opne(r'c:\text\somefile.txt').readlines())
['Welcome to this file\n'
'There is nothing here except\n'
'This stupid haiku']
注意,本例中我所使用的是文件對象自動關閉的方式。
下面是寫文件,首先是write(string):
>>>f = open(r'c:\text\somefile.txt','w')
>>>f.write('this\nis no\nhaiku')
>>>f.close()
運行后:
this
is no
haiku
最后是writelines(list):
>>>f = open(r'c:\text\somefile.txt')
>>>lines = f.readlines()
>>>f.close()
>>>line[1] = "isn't a\n"
>>>f = open(r'c:\text\somefile.txt','w')
>>>f.writelines(lines)
>>>f.close()
運行后:
this
isn't a
haiku
11.3.1 按字節處理
最常見的對文件內容進行迭代的方法是while循環中使用read方法。例如,對每個字符進行循環。
用read方法對每個字符進行循環
f = open(filename)
char = f.read(1)
while char:
process(char)
char = f.read(1)
f.close()
這個程序可以使用是因為當到達文件的末尾時,read方法返回一個空的字符串,但在那之前返回的字符串包含一個字符,如果char是真,則表示還沒有到文件末尾。
可以看到,賦值語句char = f.read(1)被重復地使用,代碼重復通常被認為是一件壞事。
用不同的方式寫循環
f = open(filename)
while True:
char = f.read(1)
if not char:break
process(char)
f.close()
11.3.2 按行操作
當處理文本文件時,經常會對文件的行進行迭代而不是處理單個字符。處理行使用的方法和處理字符一樣,即使用readline方法:
在while循環中使用readline
f = opne(filename)
while True;
line = f.readline()
if not line: break
process(line)
f.close()
11.3.3 讀取所有內容
如果文件不是很大,那么可以使用不帶參數的read方法一次讀取整個文件,或者使用readlines方法。
用read迭代每個字符
f = open(filename)
for char in f.read()
process(char)
f.close()
用readlines迭代行
f = open(filename)
for line in f.readlines():
process(line)
f.close()
11.3.4使用fileinput實現懶惰行迭代
在需要對一個非常大的文件進行迭代行的操作時,readlines會占用太多的內存。這個時候可以使用while循環和readline方法來替代。當然,在python中如果能使用for循環,那么它就是首選。本例恰好可以使用for循環可以使用一個名為懶惰行迭代的方法:說它懶惰是因為它只是讀取實際需要的文件部分。
用fileinput來對行進行迭代
import fileinput
for line in fileinput.input(filename):
process(line)
11.3.5 文件迭代器
迭代文件
f = open(filename)
for line in f:
process(line)
f.close()
對文件進行迭代而不使用變量存儲文件對象
for line in open(filename)
process(line)
注意sys.stdin是可迭代的,就像其他的文件對象。因此如果想要迭代標準輸入中的所有行,可以按如下形式使用sys.stdin.
import sys
for line in sys.stdin:
process(line)
可以對文件迭代器執行和普通迭代器相同的操作。比如將它們轉換為字符串列表(使用list(open(filename)) ),這樣所達到的效果和使用readlines一樣。
>>>f = open('somefile.txt','w')
>>>f.write('First line\n')
>>>f.write('Second line\n')
>>>f.write('Third line\n')
>>>f.close()
>>>lines = list(open('somefile.txt'))
>>>lines
['First line\n','Second line\n','Third line\n']
>>>first,second,third = open('somefile.txt')
>>>first
'First line\n'
>>>second
'Second line\n'
>>>third
'Third line\n'
在這個例子中,有幾點重要的:
1.使用print來向文件內寫入內容,,這會在提供的字符串后面增加新的行
2.使用序列來對一個打開的文件進行解包操作,把每行都放入一個單獨的變量中(這么做是很有實用性的,因為一般不知道文件中有多少行,但它演示了文件對象的“迭代性”)
3.在寫文件后關閉了文件,是為了確保數據被更新到硬盤。
總結
以上是生活随笔為你收集整理的python素材和代码_python之文件和素材的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坚果云升级后桌面出现一个文件夹
- 下一篇: c语言计算据标准时间多少天,C语言系列-