1. 程式人生 > >Python檔案輸入輸出

Python檔案輸入輸出

python檔案讀取

開啟檔案物件內建函式open()

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

得到一個檔案物件(file object):open(filename, mode='r') 

函式引數:模式mode

模式描述
r以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。
rb以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。
r+開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
rb+以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
w開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
wb以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
w+開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
wb+以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
a開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
ab以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
a+開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。
ab+以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

1 python對同一個檔案進行讀後寫(讀取檔案修改後再寫入)?

1 如果使用w+時,還沒讀就被重新整理覆蓋了,檔案什麼都沒了

2 使用r+開啟檔案後再seek(0)回到檔案頭進行寫

with open(filename, 'r+') as file:
    lines = file.read()
    lines = re.sub('<configuration>.*</configuration>', s, lines, flags = re.S)
    file.seek(0)
    file.write(lines)

2 文字與二進位制方式開啟檔案的區別

Windows平臺下 :

如果以“文字”方式開啟檔案,當讀取檔案的時候,系統會將所有的"/r/n"轉換成"/n";當寫入檔案的時候,系統會將"/n"轉換成"/r/n"寫入。
如果以"二進位制"方式開啟檔案,則讀/寫都不會進行這樣的轉換。
在Unix/Linux平臺下: “文字”與“二進位制”模式沒有區別。

lines may be terminated by any of the following: the Unix end-of-line convention ’\n’, the Macintosh convention ’\r’, or the Windows convention ’\r\n’. All of these external representations are seen as ’\n’ by the Python program.{12 Chapter 2. Built-in Functions The Python Library Reference, Release 2.6}

2 rU 或 Ua 以讀方式開啟, 同時提供通用換行符支援(PEP 278).

3 ‘w'模式寫入時檔案不存在會自動建立,但目錄不存在會報錯:FileNotFoundError: [Errno 2] No such file or directory: './doc_word_mat/AlarmClock_doc_word_mat_file.txt'

if not exists('./doc_word_mat'):
    makedir('./doc_word_mat')
doc_word_mat_file = open('./doc_word_mat/file.txt', 'w')

3 編碼encoding(開啟檔案的編碼方式)

encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding isplatform dependent, but any encoding supported by Python can bepassed.

預設方式與平臺相關,如linux下可能預設是utf-8, windows下可能是gbk.

帶BOM的utf-8編碼的txt檔案時開頭會有一個多餘的字元\ufeff,BOM被解碼為一個字元\ufeff,如何去掉?

修改encoding為utf-8_sig或者utf_8_sig

4 python檔案讀取路徑

a.py: with open("***.txt", encoding='utf-8')as f

txt檔案所在目錄對應的是這個程式碼執行的目錄(可能被另一個目錄中的檔案呼叫,則目錄就是那個檔案所在目錄),而不是當前所在的檔案a.py所在的目錄。

所以這樣開啟檔案有風險,可能***.txt和這行程式碼所在檔案a.py在一個目錄下,但是程式碼是在另一個目錄(如b.py呼叫a.py中的函式)執行,這樣就會出錯:file not found error或者no file or directory named ***.txt

lz提供一個解決方案:

所有相對路徑開啟的檔案改成這樣的:

os.path.join(os.path.split(os.path.realpath(__file__))[0], filename)

這樣就不會出錯了,lz建議都這樣寫,因為在很多專案中py檔案移來移去,雖然相對路徑沒變,但是py檔案中的程式碼可以是被其它地方呼叫執行的,還是可能出錯,lz遇到無數次了,所以如此建議~

5 python檔案中的讀入科學計數法的數字

float(num)
皮皮blog

檔案物件的方法

f.read(size)        返回最多size個位元組的str,當size預設或為負值時,整個檔案內容都被作為一個str讀出來,若到文末,返回空串' '

f.readline()        返回檔案中一行的str,末尾加上換行符'\n'

list(f) or f.readlines()         If you want to read all the lines of a file in a list

f.write(string)    將string寫入file,返回成功寫入的字元個數。

f.tell()         returns an integer giving the file object’s current position in the filerepresented as number of bytes from the beginning of the file when in binary mode andan opaque number when in text mode.

f.close()             檔案物件使用完一定要close()掉

f.seek(offset, from_what)      改變檔案物件的位置(position),offset為偏移量,from_what為參考位置,為0時從檔案開頭, 為1時使用當前的檔案位置,為2是使用檔案末尾位置。from_what預設為0

[Methods of File Objects]

使用示例

1 按行從檔案中讀取,有一種簡便的方式

1 f = open("print.py", "r+")
2 for line in f:             #line的結尾會自動有一個“\n"
3     print(line, end=" ")   #所以end=' ', 預設會又輸出換行符

2 把print.py中的內容讀出來,寫到一個新檔案中,在打印出來。

f = open("print.py", "r")
f2 = open("wyfile", "w+") #使用w+檔案不存在時候才會建立
for line in f:
    f2.write(line)
f2.seek(0)       #這行語句之前,f2的位置在文末,所以必須調整到檔案開頭。
print(f2.read(), end=' ')
f.close()       #記住要釋放
f2.colse()

[Reading and Writing Files]

Python讀取檔案的幾種方法

1. 最基本的讀檔案方法

file = open("sample.txt")
    line = file.readline()
    for line in lines:
        pass # do something
  一行一行得從檔案讀資料,顯然比較慢;不過很省記憶體。

2. 帶快取的檔案讀取

    lines = file.readlines(100000)
    for line in lines:
        pass # do something
事實證明,用同樣的資料測試,它每秒可以讀96900行資料!效率是第一種方法的3倍!

3.linecache檔案讀取

lines = linecache.getlines(r'.\datasets\lastfm-dataset-1K\item_item_csr_mat.mtx')[2:-1]
for l in lines:
pass
讀取速度是前兩個的N倍--///
讀取並表示成相同資料型別的時間比較
s = time.time()
lines = [line.split() for line in linecache.getlines(checkin_filename)]
e = time.time()
print(e - s)
lines = np.loadtxt(checkin_filename, dtype=bytes).astype(str)
s = time.time()
print(s - e)
lines = pd.read_csv(checkin_filename, sep='\t', header=None, parse_dates=[1])
e = time.time()
print(e - s)
11.72770071029663
168.77640986442566
130.63407826423645

4.Python with open file 用with語句開啟檔案

python中的with的作用是自動釋放物件,即使物件在使用的過程中有異常丟擲。可以使用with的型別必須實現__enter__ __exit__。我的理解是=try...finally{},在finally中呼叫了釋放函式。

[類似與CSharp中的using(){}關鍵字,用來自動確保呼叫物件的dispose()方法,即使物件有異常丟擲。C#中可以使用using{}的物件必須已經實現了IDispose介面。]

def TestWith():
  with open("myfile.txt") as f:
     for line in f:
         print (line)
  f.readline() #f is already clean up here, here will meet ValueError exceptionNote:
1. with + try...except既能讓物件自動釋放,又包含了異常捕獲的功能
2.The with statement is a useful when accessing anything that supports the context management protocol. Which meansopen() for example. It basically makes sure that any set up and clean up code, such as closing files, is run without having to worry about it.
[]
[淺談 Python 的 with 語句]

[模組contextlib,使你不用構造含有__enter__, __exit__的類就可以使用with]
皮皮blog

Python檔案關閉機制

1. 最簡單的就是我們可以通過呼叫f.close()顯式地關閉檔案。一旦我們關閉了檔案,該檔案物件依然存在,但是我們無法再通過它來讀取檔案內容了,而且檔案物件返回的可列印內容也表明檔案已經被關閉。

2. 開啟檔案的優選最佳實踐方式是使用前面的 “with” 語句。在 “with” 開啟的程式碼塊內,檔案是開啟的,而且可以自由讀取。然而,一旦Python程式碼從 “with” 負責的程式碼段退出,檔案會自動關閉。所以,通過使用 “with”,你避免了顯式地關閉檔案的操作。Python 會以一種不那麼有 Python 風格的方式在幕後神奇而靜靜地替你關閉檔案。

但是你不顯式地關閉檔案會怎樣?如果你有點懶,既不使用 “with” 程式碼塊也不呼叫f.close()怎麼辦?這時檔案會什麼時候關閉?
我總是假定當物件的引用計數降為0時,Python會關閉檔案,進而垃圾回收機制清理檔案物件。當我們讀檔案時很難證明或核實這一點,但寫入檔案時卻很容易。這是因為當寫入檔案時,內容並不會立即重新整理到磁碟(除非你向“open”方法的第三個可選引數傳入“False”),只有當檔案關閉時才會重新整理。
f = open('/tmp/output', 'w')
f.write('abcn')
f.write('defn')
# check contents of /tmp/output (1)
del(f)
# check contents of /tmp/output (2)
# exit from Python
# check contents of /tmp/output (3)
實驗表明:
1. Python 2.7,報告顯示在階段一檔案存在但是是空的,階段二和階段三中檔案包含所有的內容。這樣,在CPython 2.7中我最初的直覺似乎是正確的:當一個檔案物件被垃圾回收時,它的 __del__ (或者等價的)方法會重新整理並關閉檔案。而且在我的IPython程序中呼叫“lsof”命令顯示檔案確實在引用物件移除後被關閉了。

2. Python3 ,得到了相同的結果。移除對檔案物件最後的引用後會導致檔案被重新整理並且被關閉。

3. PyPy 和 Jython下,得到了不同的結果!刪除檔案物件的引用後——也就是在階段2,並沒有導致檔案內容被刷入磁碟。我不得不假設這和垃圾回收機制的不同或其他在 PyPy 和 CPython中工作機制的不同有關係。但是如果你在 PyPy中執行程式,就絕不要指望僅僅因為檔案物件的引用結束,檔案就會被重新整理和關閉。命令 lsof 顯示直到Python程序退出時檔案才會被釋放。也就是說,從 Python 退出確實會確保快取中的資料寫入磁碟。

4.在 Python 2.7 的環境下,“abcn” * 1000 語句執行後沒有任何東西寫入。但“defn” * 1000 語句執行後,檔案包含有4096個位元組——可能代表緩衝區的大小。呼叫 del(f) 刪除檔案物件的引用導致資料被刷入磁碟和檔案關閉,此時檔案中共有8000位元組的資料。所以忽略字串大小的話 Python 2.7 的行為表現基本相同。唯一不同的是如果超出了緩衝區的大小,那麼一些資料將在最後檔案關閉資料重新整理前寫入磁碟。

換做是Python 3的話,情況就有些不同了。f.write執行後沒有任何資料會寫入。但是檔案物件引用一旦結束,檔案就會重新整理並關閉。這可能是緩衝區很大的緣故。但毫無疑問,刪除檔案物件引用會使檔案重新整理並關閉。

5. 至於 PyPy 和 Jython,對大檔案和小檔案的操作結果都一樣:檔案在 PyPy 或 Jython 程序結束的時候重新整理並關閉,而不是在檔案物件的引用結束的時候。

Note:然而如果使用 “with” 進行了實驗。在所有情況下,我們都能夠輕鬆的預測檔案是何時被重新整理和關閉的——就是當退出程式碼段,並且上下文管理器在後臺呼叫合適方法的時候。
如果你不使用“with”,那麼至少在非常簡單的情形下,你的資料不一定有丟失的危險。然而你還是不能確定資料到底是在檔案物件引用結束還是程式退出的時候被儲存的。如果你假定因為對檔案唯一的引用是一個本地變數所以檔案在函式返回時會關閉,那麼事實一定會讓你感到吃驚。如果你有多個程序或執行緒同時對一個檔案進行寫操作,那麼你真的要非常小心了。
[Python檔案關閉機制詳解]

python檔案讀取技巧

計算檔案的行數

最簡單的辦法是把檔案讀入一個大的列表中,然後統計列表的長度.如果檔案的路徑是以引數的形式filepath傳遞的,那麼只用一行程式碼就可以完成我們的需求了:
count = len(open(filepath,'rU').readlines())
如果是非常大的檔案,上面的方法可能很慢,甚至失效.此時,可以使用迴圈來處理:
count = -1
for count, line in enumerate(open(thefilepath, 'rU')):
   pass
count += 1
另外一種處理大檔案比較快的方法是統計檔案中換行符的個數'\n  '(或者包含'\n'的字串,如在windows系統中):
count = 0
thefile = open(thefilepath, 'rb')    #引數'rb'是必須的,否則在windows系統上,上面的程式碼會非常慢.
while True:
   buffer = thefile.read(8192*1024)
   if not buffer:
       break
   count += buffer.count('\n')
thefile.close( )

python對目錄下的檔案排序

python讀入檔案到矩陣中

1. numpy讀取

2.pandas讀取

from:http://blog.csdn.net/pipisorry/article/details/37769669
ref: [Reading and Writing Files]
Python格式化輸出到檔案
python讀寫word、csv、json檔案
python檔案、目錄及路徑操作
python模組 - pickle模組
使用 Python 讀取 8 GB 大小的檔案

相關推薦

Python檔案輸入輸出

python檔案讀取開啟檔案物件內建函式open()file object = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶得到一個檔案物件(fi

利用python進行資料分析-----第二篇 Numpy 陣列 向量計算 索引 切片 轉置 軸對換 檔案輸入輸出

目錄 布林值索引 花式索引 其他函式 排序 線性代數 隨機數生成 Numpy簡介 NumPy是一種通用的陣列處理軟體包,旨在有效地操縱任意記錄的大型多維陣列,而不會為小

Python 標準輸入輸出stdin stdout stderr 對照c解讀 為理解Linux的檔案描述符fileno做鋪墊

參考連結 詳解stdin,stdout,stderr 作者: 茶鹽耙 How to print to stderr in Python 作者:stack overflow 標準輸入流:鍵盤、掃碼槍等輸入裝置輸入的東西。 標準輸出流:螢幕、檔案等接受的東西 緩衝區:記憶體? 檔

python練習輸入輸出

format bsp ice 三角形 一個數 credit 1.0 world turtle 1 Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32

python基礎---輸入輸出

其他 python true sep spa 基礎 put color 兩個 1、輸入字符串。 name=input() or name=input(‘please input a string‘) 這樣可以接收一個字符串,包括空格,都可以輸入。只有

freopen - C/C++檔案輸入輸出利器

freopen以前經常使用,比較方便,可以當作模板,在中間替換為自己的程式碼即可使用。 [cpp] view plain copy #incl

檔案輸入輸出及csv檔案

讀取檔案 fileobject=open('b.txt') result=fileobject.read() print(result) fileobject.close() 測試結果如下圖所示: 寫入檔案: fileobject=open('c.txt',mode='w')

檔案輸入輸出的管理以及管道的使用

在linux作業系統中,一個程式被載入到記憶體並開始執行後是以程序的形式的形態表現出來的,而系統宗的每一個程序在預設的情況下都有三個標準的通道,分別為標準輸入、標準輸出和標準錯誤輸出。標準輸入的操作程式碼為0,標準輸出的操作程式碼為1,標準錯誤輸出的操作程式碼為2。 在linux系統中用普通使用者執行命令

檔案輸入輸出【模板】

檔案輸入輸出【模板】 直接看程式碼 #include <cstdio> int main() { freopen("*.in","r",stdin); freopen("*.out","w",stdout); /*---code---*/ /*---end-

小學生出題系統(檔案輸入輸出

//信1705-2 20173629 何偉豪 package 小學計算題檔案; import java.util.Random; //隨機生成數字的標頭檔案 import java.util.Scanner; //輸入整型資料的標頭檔案 import java.io.*; import

Python輸入輸出

Python輸入輸出 1. print與input print的基本用法 input的基本用法 小結 2. 檔案讀寫操作 開啟關閉檔案 讀檔案 寫檔案 其他檔案操作

利用陣列的的檔案輸入輸出

利用陣列的檔案輸入輸出 1. 將陣列以二進位制格式儲存到磁碟 np.save和np.load是讀寫磁碟陣列資料的兩個主要函式。預設情況下,陣列是以未壓縮的原始二進位制格式儲存在副檔名為.npy的檔案中的。   import numpy as np arr=np.arange(10)

Python基礎-python輸入輸出(python2與python3的區別);算術運算子

程式:輸入(鍵盤)----程式碼(java/python/c)----輸出(螢幕) #每一行程式碼只負責完成一個動作 #print的作用:把內容輸出到螢幕上來 #python是一個格式非常嚴格的程式設計語言,每行程式碼前面都不要增加空格 輸入: 1.1 pyhon2*

python輸入輸出——python2和python3的主要區別

一、python的輸入輸出: 程式的輸入輸出流程: 輸入(鍵盤) ————程式碼(java/python/c)————輸出(螢幕) 變數的定義: 在python中。每個變數在使用之前都必須賦值,變數賦值後該變數才會被建立。 等號(=)就算用來給變數賦值的。

C ++基礎 | 格式化輸出檔案輸入輸出(File IO),標頭檔案(Header Files)_3

目錄 格式化輸出 檔案輸入輸出(File IO) 標頭檔案(Header Files) 格式化輸出 要格式化資料,我們可以使用轉義字串(Escape Sequence)也稱字元實體(Character Entity)。這些不需要任何額外的庫。 C ++ 轉義字串

python基礎-輸入輸出

''' input print 知識點: 1.input預設接收使用者輸入內容為字串型別 2.print直接輸出字串內容 ''' ''' card_id = input('請輸入學號:') pwd = input('請輸入密碼:') print(card_id)

Numpy_06 陣列的檔案輸入輸出 線性代數

將陣列寫入本地,將陣列從本地讀取 import numpy as np # NumPy能夠讀寫磁碟上的文字資料或二進位制資料。 # np.save和np.load是讀寫磁碟陣列資料的兩個主要函式。預設

C++檔案輸入輸出

ACM中巧用檔案的輸入輸出來改寫acm程式的輸入輸出 經常有見大神們使用檔案來代替ACM程式中的IO,尤其是當程式IO比較複雜時,可以使自己能夠更專注於程式碼的測試,而不是怎樣敲輸入。   /* *@Author: STZG *@Language: C++ */ #in

C/C++檔案輸入輸出(詳細介紹)

´在標頭檔案iostream中定義有兩個流類:輸入流類istream和輸出流類ostream,且用這兩個類定義了流物件cin和cout: ´Istream cin; ´ostream cout; ´cin是一個istream類的物件,它從標準輸入裝置(鍵盤)獲取資料

Python輸入輸出的方法使用

#!/usr/bin/env python # -*-coding:utf-8 -*- import os import re parter="(13|15|18)\d{9}"; strs="simonmegn13056865679www.techportal.