第11章 檔案

2021-10-13 12:44:14 字數 4936 閱讀 3097

open(file, mode = 'rt')

返回乙個檔案物件,若檔案不存在則返回異常

traceback (most recent call last):

file "", line 1, in

filenotfounderror: [errno 2] no such file or directory: 'somefile.txt

函式open的引數mode的最常見取值 值

描述r讀取模式(預設值)

w寫入模式(既有內容將被刪除)

x獨佔寫入模式,在檔案已經存在時引發fileexistserror異常

a附加模式

b二進位制模式(與其他模式結合使用)

t文字模式(預設值,與其他模式結合使用)

+讀寫模式(與其他模式結合使用)

r+和w+均為可讀寫,但r+不會截斷檔案,而w+會截斷檔案

1. 檔案的讀取和寫入

>>>f = open('somefile.txt', 'w')

>>>f.write('hello, ')

7>>>f.write('world!')

6>>>f.close()

>>>f = open('somefile.txt', 'r')

>>>f.read(4)

'hell'

>>>f.read()

'o, world!'

2. 使用管道重定向輸出

這條管道線包含三個命令:

 cat somefile.txt:將檔案somefile.txt的內容寫入到標準輸出( sys.stdout)。

 python somescript.py:執行python指令碼somescript。這個指令碼從其標準輸入中讀取,並將結果寫入到標準輸出。

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

但這些管道字元( |)有何作用呢?指令碼somescript.py的作用是什麼呢?管道將乙個命令的標準輸出鏈結到下乙個命令的標準輸入。很聰明吧?因此可以認為, somescript.py從其sys.stdin中讀取資料(這些資料是somefile.txt寫入的),並將結果寫入到其sys.stdout( sort將從這裡獲取資料)

3. 隨機訪問

seek(offset[, whence])將當前位置移到offset和whence指定的地方,offset為位元組數,whence可取:

io.seek_set(0)預設,檔案開頭

io.seek_cur(1)檔案當前位置

io.seek_end(2)檔案結尾

tell()返回檔案當前位置

>>>f = open('somefile.txt', 'w')

>>>f.write('01234567890123456789')

20>>>f.seek(5)

5>>>f.write('hello, world!')

13>>>f.close()

>>>f = open('somefile.txt')

>>>f.read()

'01234hello, world!89'

>>>f.close()

>>>f = open('somefile.txt')

>>>f.read(3)

'012'

>>>f.read(2)

'34'

>>>f.tell()

5>>>f.close()

4. 讀取和寫入行

讀取readline()、readlines()

寫入writelines()

程式執行前somefile.txt中的內容為

your mother was a hamster and your

father smelled of elderberries.

your mother was a hamster and your

father smelled of elderberries.

your mother was a hamster and your

father smelled of elderberries.

your mother was a hamster and your

father smelled of elderberries.

your mother was a hamster and your

father smelled of elderberries.

>>>f = open('somefile.txt')

>>>f.readline(3)

'you'

>>>f.readline()

'r mother was a hamster and your\n'

>>>f.readlines()

['father smelled of elderberries.\n', 'your mother was a hamster and your\n', 'father smelled of elderberries.\n', 'your mother was a hamster and your\n', 'father smelled of elderberries.\n', 'your mother was a hamster and your\n', 'father smelled of elderberries.\n', 'your mother was a hamster and your\n', 'father smelled of elderberries.']

>>>f.close()

>>>f = open('somefile.txt', 'w')

>>>words = ['aaaaa', 'bbbbbb', 'ccccc', 'ddddddd']

>>>f.writelines(words)

>>>f.close()

執行完上述**後檔案somefile.txt中的內容

aaaaabbbbbbcccccddddddd
5. 關閉檔案

1)close,為確保檔案關閉,一般寫作

try:

#將資料寫入檔案中

finally:

file.close()

2)專門為此設計的語句

with open('somefile.txt') as somefile:

do_something(somefile)

with語句讓你能夠開啟檔案並將其賦給乙個變數(這裡是somefile)。在語句體中,你將資料寫入檔案(還可能做其他事情)。到達該語句末尾時,將自動關閉檔案,即便出現異常亦如此。

如果不寫入檔案,並非一定要關閉檔案

def process(string):

print('processing:', string)

1. 每次乙個字元(或位元組)

with open(filename) as f:

char = f.read(1)

while char:

process(char)

char = f.read(1)

with open(filename) as f:

while true:

char = f.read(1)

if not char: break

process(char)

2. 每次一行

with open(filename) as f:

while true:

line = f.readline()

if not line: break

process(line)

3. 讀取所有內容(檔案不太大的情況)

#f.read()不帶引數,將整個檔案讀取到乙個字串中

with open(filename) as f:

for char in f.read():

process(char)

#readlines方法將檔案讀取到乙個字串列表中,其中每個字串是一行

with open(filename) as f:

for line in f.readlines():

process(line)

4. 使用fileinput實現延遲行迭代

有時候需要迭代大型檔案中的行,此時使用readlines將占用太多記憶體。當然,可以結合使用while迴圈和readline,但在python中,在可能的情況下,應首選for迴圈,而這裡就屬於這種情況。可以使用一種名為延遲行迭代的方法——說它延遲是因為它只讀取實際需要的文字部分。

import fileinput

for line in fileinput.input(filename):

process(line)

5. 文字迭代器(最常見的方法,因為文字是可迭代的)

with open(filename) as f:

for line in f:

process(line)

如果不對檔案進行寫操作,那麼可以不對檔案進行關閉或使用with(即將檔案作為上下文管理器)

for line in open(filename):

process(line)

sys.stdin(即標準輸入)也是可以迭代的,因次可以這樣做:

import sys

for line in sys.stdin:

process(line)

第11章 執行緒

執行緒標識 就像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,但執行緒id不同,執行緒id只有在它所屬的程序上下文中才有意義。程序id 用pid t資料型別表示 執行緒id用pthread t資料型別來表示 includeint pthread equal ...

第11章 執行緒

1.執行緒的作用 1 對於程式設計而言 當我們的乙個程序在某一時刻,需要做的事件不止一件的時候,一般有兩種方法。一種是採用非同步程式設計的模式,一種是採用多執行緒同步模式。但是多執行緒同步模式遠遠比非同步模式要方便的多。但是對於單核系統,往往非同步程式設計模式效率更高。2 對於互動程式,一般都是要多...

第11章 函式

1 把相關的語句組合在一起,並且賦予相應的名稱,用這種方法來給程式分塊,這種形式的組合就是函式,函式也叫例程或者過程。程式總是從 main 函式開始啟動。函式由函式名 引數 返回值型別以及一組包含操作語句的語句塊組成。函式可以支援過載,程式就是由函式組成。2 形參是函式定義時在形參表中定義的,並且由...