python--文件的讀寫操作


Python提供了必要的函數和方法進行默認情況下的文件基本操作

文件打開方式:

open(name[,mode[buf]]) name:文件路徑 mode:打開方式 buf:緩沖buffering大小

 

文件讀取方式:

read([size]):讀取文件(讀取size字節,默認讀取全部)

readline([size]):讀取一行

readline([size]) :讀取緩沖buf(io.DEFAULT_SET_BUFFER),返回每一行所組成的列表

iter:使用迭代器遍歷讀取文件 f.open(name);iter_f = iter(f);用for line in iter_f循環迭代器

with open('pi_digits.txt') as f: # 默認模式為‘r’,只讀模式

contents = f.read() # 讀取文件全部內容

 

文件寫入方式:

write(str):將字符串寫入文件

writelines(sequence_of_strings):寫多行到文件,參數為可迭代的對象

當調用write(str)時,python解釋器調用系統調用想把把內容寫到磁盤,但是linux內核有文件緩存機制,所以緩存到內核的緩存區,當調用close()或flush()時才會真正的把內容寫到文件

或者寫入數據量大於或者等於寫緩存,寫緩存也會同步到磁盤上

關閉文件的目的

1:寫緩存同步到磁盤

2:linux系統中每個進程打開文件的個數是有限的

3:如果打開文件數到了系統限制,在打開文件就會失敗

python文件指針的操作:

seek(offset[,whence])移動文件指針

offset:偏移量,可以為負數

whence:偏移相對位置

python文件指針的定位方式:

os.SEEK_SET 相對於文件的起始位置 0

os.SEEK_CUR 相對於文件的當前位置 1

os.SEEK_END 相對於文件的結尾位置 2

Python 文件屬性:

file.fileno(): 文件描述符;

file.mode: 文件打開權限;

file.encoding: 文件編碼方式;

file.closed: 文件是否關閉;

Python 標准文件:

標准輸入文件:sys.stdin; 只讀 描述符為0

標准輸出文件:sys.stdout; 只寫 描述符為1

標准錯誤文件:sys.stderr; 只寫 描述符為2

Python 命令行參數:

sys模塊提供sys.argv屬性,通過該屬性可以得到命令行參數。sys.argv是一個字符串序列,保存着命令行的參數,其中sys.argv[0]是文件名,1~n是真正的參數

Python 文件編碼方式

Python文件默認的編碼格式是ASCII格式,要寫入中文可以將編碼格式進行轉換

1. a = unicode.encode(u'你好', 'utf-8') 轉換, 一個漢字在ASCII碼中占3字節,在unicode中占2字節。

2. 直接創建utf-8格式的文件。使用codecs模塊提供的方法創建指定編碼格式文件:

codecs.open(fname, mode, encoding, errors, buffering): 使用指定編碼格式打開文件

3. 使用系統提供的open()函數也可以創建指定編碼格式的文件:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Linux文件系統簡單示意圖


下面是python操作文件的流程

 

python基礎 3.0 file 讀取文件

 
一.python  文件訪問
1.在python中要訪問文件,首先要打開文件,也就是open
r:  只讀
w:  只寫 ,文件已存在則清空,不存在則創建
a:追加 ,寫到文件末尾。如果文件存在,則在文件最后去追
    加。文件不存在就去創建   
+-:更新(可讀可寫)
 
r+ :以讀寫模式打開
w+ :以讀寫模式打開(參見w)
a+:以讀寫模式打開(參見a)
rb:以二進制讀模式打開
wb:以二進制寫模式打開
ab:以二進制追加模式打開(參見a)
rb+:以二進制讀寫模式打開(參見r+)
wb+:以二進制讀寫模式打開(參見w+)
ab+: 以二進制讀寫模式打開(參見a+)
 
2.打開文件。open打開文件 read讀文件,close關閉文件
 
import codecs
fd = codecs.open('2.txt')
print fd.read()
fd.close()
 
>>> 11111
2222
33333
aaaaa
bbbbb
cccccc
 
3.查看文件有哪些方法
 
import codecs
fd = codecs.open('b.txt')
print fd.read()
print dir(fd)
fd.close()
 
>>> 11111
2222
333333
['close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
 
1>fd.read() 方法,read()方法讀取的是整篇文檔。
 
fd = codecs.open('2.txt')
text = fd.read()
print type(text)
 
>>><type 'str'>
 
 
2>replace()函數替換文件中的某個元素。打開文件,讀取后,對整個字符串進行操作.把2.txt 文件中的1替換成z
 
fd = codecs.open('2.txt')
a1 = fd.read()
print a1
a2 = a1.replace('1','z')
print a2
 
>>> 11111
2222
33333
aaaaa
bbbbb
cccccc
 
zzzzz
2222
33333
aaaaa
bbbbb
cccccc
 
3> 寫文件,codecs.open()函數,避免文件亂碼
 
fd = codecs.open('3.txt','w')
fd.write('liuzhenchuan\n')
fd.write('hello world\n')
fd.write('xiaban\n')
fd.close()
 
>>> liuzhenchuan
hello world
xiaban
 
 
4>fd.readlines()方法,讀取文件,最后把文件每行內容作為一個字符串放在一個list中
 
fd = open('3.txt')
print fd.readlines()
fd.close()
 
>>> ['liuzhenchuan\n', 'hello world\n', 'xiaban\n']
 
 
5>fd.readline()方法,讀取文件,讀取文件一行,類型為字符串
>>> l
 
 
6>#fd.readline()方法,讀取文件一行內容,返回一個字符串.          # fd.next()方法,讀取文件下一行內容,返回一個字符串
 
fd = codecs.open('3.txt','r')
print fd.readline()
print fd.next()
fd.close()
 
>>> liuzhenchuan
 
    hello world
 
 
7>#write()方法,必須傳入一個字符串. 
fd = codecs.open('5.txt','w+')
fd.write('a\nb\nc\n')
fd.close()
 
>>> a
    b
    c
 
 
#writelines()方法,必須傳入一個列表/序列
fd = codecs.open('6.txt','w')
fd.writelines(['123\n','234\n','345\n'])
fd.close()
 
>>> 123
    234
    345
 
 
8>with用法,不需要用fd.close()關閉文件
with codecs.open('3.txt','rb') as fd:
    print fd.read()
    fd.close()
 
>>> liuzhenchuan
hello world
xiaban
 
 
9>打印文件行號和文件內容
with codecs.open('2.txt') as fd:
    for line,value in enumerate(fd):
        print line,value,
 
>>> 0 liuzhenchuan
    1 hello world
    2 xiaban
 
 
10>過濾文件某行的內容
with codecs.open('3.txt') as fd:
    for line,value in enumerate(fd):
        if line == 3-2:
            print value
 
>>> hello world
 
 
11>導入linecache模塊,使用linecache.getline()方法,獲取文件固定行的內容
import linecache
count = linecache.getline('3.txt',1)
print count
 
>>> liuzhenchuan
 
 
 

當然,這種方法是普通的寫入和讀取,我們通常還有這樣的問題,那就是字典啊,元祖啊,集合啊等對象,需要寫入,但是讀取的時候還是要按照原來的形式讀取,並非上述方法中的字符串方式讀取。那我們就可以使用pickle這個工具了:

首先要導入包

1
import  pickle

然后要進行代碼的編寫,這里要記住,寫入文件模式是wb,讀取時rb(b一般都是二進制,想必大家應該知道了,它的存儲方式):

1
pick_file  =  open ( "pick.pick" , 'wb' )

如果此時,我們有一個集合:

1
list1  =  [ 1 , 2 , 3 , 4 , 5 , 'abd' ,[ 'a' , 4 , 'g' , 'd' ]]

則,我么可以這樣存儲:

1
2
pickle.dump(list1,pick_file)
pickle.close()

如果讀取時候,我們可以這樣做:

1
2
3
pick_file  =  open ( "pick.pick" , 'wb' )
list2  =  pickle.load(pick_file)
pickle.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM