天天看點

Python檔案和流

Treasuring every moment

open函數

open(name[,mode[,buffering]])
mode有四種模式可選擇:
  • 'r' 讀模式
  • 'w' 寫模式
  • 'a' 追加模式
  • 'b' 二進制模式(可添加到其他模式中使用) 'rb' 可讀二進制模式
  • '+' 讀/寫模式

>write():參數為寫入的内容
>>> f = open('somefile.txt','w')
f.write('Hello, ')
7
>>> f.write('World!')
6
>>> f.close()
>writelines():參數為一個字元串清單,它會把所有的字元串寫入檔案,但不會增加新的行
           

read():參數為指定讀多少字元(位元組)
>>> f = open('somefile.txt','r')
>>> f.read(4)
'Hell'
>>> f.read(1)
'o'
>>> f.read()
', World!'
           

readline():讀一行,包括換行符也一起讀進來

readlines():讀取檔案的所有行并将其轉換為清單傳回

管式輸出

demo.py

import sys
text = sys.stdin.read()
words = text.split()
wordcount=len(words)
print('Wordcount:',wordcount,'Text:',text)
           

somefile.txt

Hello,World!

運作程式

$ cat somefile.txt | python demo.py
('Wordcount:', 1, 'Text:', 'Hello,World!')
           

可以看出,管道符号(|)将一個指令的标準輸出和下一個指令的标準輸入連接配接在一起了。

随機通路

以上對檔案的操作都是把檔案當成流來進行操作,隻能按照從頭到尾的順序讀取資料。但是我們可以使用類檔案對象的方法seek和tell來直接通路感興趣的部分。

seek(offset[,whence ]):這個方法把目前位置移動到由offset和whence定義的位置。Offset類是一個位元組(字元)數,表示偏移量。whence預設是0,表示偏移量是從檔案開頭開始計算的(這是偏移量必須是非負的)。
>>> f = open('somefile.txt','w')
>>> f.write('0123456789')
>>> f.seek(5)
>>> f.write('hello,world')
>>> f.close()

>>> f = open('somefile.txt')
>>> f.read()
'01234hello,world6789'
           
tell():傳回目前檔案的位置
>>> f = open('somefile.txt')
>>> f.read(3)
'012'
>>> f.read(2)
'34'
>>> f.tell()
5