python文件io
❶ python程序運行後提示IOError: [Errno 22] Invalid argument 急啊!!!!
python程序運行後提示IOError: [Errno 22] Invalid argument是設置錯誤造成的,解決方法為:
1、根據提示找到錯誤代碼處進行查看,是open函數出了問題。
❷ 如何用php通過root調用python文件控制樹莓派的IO口
可以使用python製作api介面,然後php通過介面去進行相舉源關的操作。這也是目前正咐態最完美的解決跨平台控制的方簡橘法。
❸ 日誌文件太大,python怎麼分割文件,多線程操作
python的多線程為偽多線程,多線程並不能提高文件IO的速度,在讀取文件時使用直接讀取 for line in open('文件名', 'r') 效率最高,因為此方式為直接讀取,不像其它方式要把文件全部載入到內存再讀取,所以效率最高。分割時文件時,提前計算好行數,把讀取的每固定數量的行數存入新文件,直接讀取完成,最後刪除舊文件,即可實現文件分割。
示意代碼:
line_count=0
index=0
fw=open('part'+str(index)+'.log','w')
forlineinopen('filename.log','r'):
fw.write(line)
line_count+=1
#假設每10000行寫一個文件
ifline_count>10000:
fw.close()
index+=1
fw=open('part'+str(index)+'.log','w')
fw.close()
❹ python 文件寫入內存
BytesIO實現了在內存中讀寫bytes,我們創宴敬此建一個BytesIO,然後寫入一些bytes:
注意,寫入的不稿世是str,而是經過UTF-8編碼的晌迅bytes。
可以用一個bytes初始化BytesIO,然後,像讀文件一樣讀取:
和StringIO類似
❺ 用python打開文件總是出現IOError怎麼回事
用python打開文件總是出現IOError的原因:
1.python ioerror的出現:打開一個不存在的文件,示例中有意輸入了一個不存在的文件名,並試圖打開它。程序找不到這個文件名所以引發了IOError
」Traceback (most recent call last): File "<stdin>", line 1, in <mole>IOError: [Errno 2] No such file or directory: 'a.txt'「
2.文件寫入時遇到python error錯誤原因。有同學遇到了IOError Errno 0 錯誤的情況,在用a+方式打開文件,之後讀取該文件內容。修改讀取的內容後重新寫入文件,在寫入時程序也遇到了IOError錯誤。這時要注意在讀取文件之後記得要把文件關閉,當你需要寫入文件時,要再將文件以w+方式打開寫入。加深學習Python open()函數文件打開、讀、寫基礎操作,可以減少類似情況發生。
3.當你不能滿足被訪問文件所設置的許可權時,也會引發IO Error錯誤,類似這樣
」IOError: [Errno 13] Permission denied: 'c:/a.txt' python permission denied「
從字面意思來理解就可以知道原因了,是因為我們執行的命令(運行python文件等),沒有許可權,給一個超級管理員許可權就可以了。
❻ python協程和非同步IO——IO多路復用
C10k是一個在1999年被提出來的技術挑戰,如何在一顆1GHz CPU,2G內存,1gbps網路環境下,讓單台伺服器鏈滾同時為1萬個客戶端提供FTP服務
阻塞式I/O(使用最擾掘多)、非阻塞式I/O、I/O復用、信號驅動式I/O(幾乎不使用)、非同步I/O(POSIX的aio_系列函數)
select、poll、epoll都是IO多路復用的機制。I/O多路復用就是通過一種機制,一個進程可以監聽多個描述符,一旦,某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。但select、poll、epoll本質上都是同步I/O,因為他們都需要在讀寫時間就緒後負責進行讀寫,也就是說讀寫過程是阻塞的,而非同步I/O無需自己負責進行讀寫,非同步I/O的實現會負責把數據從內核拷貝到用戶空間
(1)select
select函數監視的文件描述符分3類,分別是writefds、readfds、exceptfds。調用select函數會阻塞,直到有描述符就緒(有數據可讀、可寫或者有except),或者超時函數返回。當select函數返回後可以通過遍歷fdset來找到就緒的描述符。
select目前幾乎在所有的平台上支持,其良好的跨平台支持也是它的一個優點。select的一個缺點在於單個進程能夠監視的文件描述符的數量存在最大緩喚核限制,在linux上一般為1024,可以通過修改宏定義甚至重新編譯內核的方式提升這一限制,但是這樣也會降低效率。
(2)poll
不同於select使用三個點陣圖來表示三個fdset的方式,poll使用一個pollfd的指針實現。
pollfd結構包含了要監視的event和發生的event,不再使用select"參數-值"傳遞的方式。同時pollfd並沒有最大數量限制(但是數量過大後性能也會下降)。和select函數一樣,poll返回後,需要輪詢pollfd來獲取就緒的描述符。
從上面看,select和poll都需要在返回後通過遍歷文件描述符來獲取已經就緒的socket。事實上同時連接的大量客戶端在同一時刻可能只有很少的處於就緒的狀態,因此隨著監視的描述符數量的增長,其效率也會線性下降
(3)epoll
epoll是在2.6內核中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加領靈活,沒有描述符限制。epoll使用一個文件描述符管理多個描述符,將用戶關系的文件描述符的事件存放到內核的一個事件表中,這樣在用戶空間和內核空間的只需一次。
❼ python怎麼打開文件模式
讀寫文件是最常見的IO操作。Python內置了讀寫文件的函數,用法和C是兼容的。
讀寫文件前,我們先必須了解一下,在磁碟上讀寫文件的功能都是由操作系統提供的,現代操作系統不允許普通的程序直接操作磁碟,所以,讀寫文件就是請求操作系統打開一個文件對象(通常稱為文件描述符),然後,通過操作系統提供的介面從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。
讀文件
要以讀文件的模式打開一個文件對象,使用Python內置的open()函數,傳入文件名和標示符:
>>> f = open('/Users/michael/test.txt', 'r')
標示符'r'表示讀,這樣,我們就成功地打開了一個文件。
如果文件不存在,open()函數就會拋出一個IOError的錯誤,並且給出錯誤碼和詳細的信息告訴你文件不存在:
>>> f=open('/Users/michael/notfound.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
如果文件打開成功,接下來,調用read()方法可以一次讀取文件的全部內容,Python把內容讀到內存,用一個str對象表示:
>>> f.read()'Hello, world!'
最後一步是調用close()方法關閉文件。文件使用完畢後必須關閉,因為文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的:
>>> f.close()
由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。所以,為了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally來實現:
try:
f = open('/path/to/file', 'r')
print(f.read())finally: if f:
f.close()
但是每次都這么寫實在太繁瑣,所以,Python引入了with語句來自動幫我們調用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
這和前面的try ... finally是一樣的,但是代碼更佳簡潔,並且不必調用f.close()方法。
調用read()會一次性讀取文件的全部內容,如果文件有10G,內存就爆了,所以,要保險起見,可以反復調用read(size)方法,每次最多讀取size個位元組的內容。另外,調用readline()可以每次讀取一行內容,調用readlines()一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼調用。
如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)比較保險;如果是配置文件,調用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'刪掉
file-like Object
像open()函數返回的這種有個read()方法的對象,在Python中統稱為file-like Object。除了file外,還可以是內存的位元組流,網路流,自定義流等等。file-like Object不要求從特定類繼承,只要寫個read()方法就行。
StringIO就是在內存中創建的file-like Object,常用作臨時緩沖。
二進制文件
前面講的默認都是讀取文本文件,並且是UTF-8編碼的文本文件。要讀取二進制文件,比如圖片、視頻等等,用'rb'模式打開文件即可:
>>> f = open('/Users/michael/test.jpg', 'rb')>>> f.read()b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進製表示的位元組
字元編碼
要讀取非UTF-8編碼的文本文件,需要給open()函數傳入encoding參數,例如,讀取GBK編碼的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')>>> f.read()'測試'
遇到有些編碼不規范的文件,你可能會遇到UnicodeDecodeError,因為在文本文件中可能夾雜了一些非法編碼的字元。遇到這種情況,open()函數還接收一個errors參數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
寫文件
寫文件和讀文件是一樣的,唯一區別是調用open()函數時,傳入標識符'w'或者'wb'表示寫文本文件或寫二進制文件:
>>> f = open('/Users/michael/test.txt', 'w')>>> f.write('Hello, world!')>>> f.close()
你可以反復調用write()來寫入文件,但是務必要調用f.close()來關閉文件。當我們寫文件時,操作系統往往不會立刻把數據寫入磁碟,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁碟。忘記調用close()的後果是數據可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with語句來得保險:
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
要寫入特定編碼的文本文件,請給open()函數傳入encoding參數,將字元串自動轉換成指定編碼。
細心的童鞋會發現,以'w'模式寫入文件時,如果文件已存在,會直接覆蓋(相當於刪掉後新寫入一個文件)。如果我們希望追加到文件末尾怎麼辦?可以傳入'a'以追加(append)模式寫入。
所有模式的定義及含義可以參考Python的官方文檔。
❽ Python基礎之:Python中的IO
IO就是輸入和輸出,任何一個程序如果和外部希望有交互的話,都需要使用到IO。相對於java而言,Python中的IO更加的簡單,易用。
本文將會詳細介紹Python中的IO操作。
linux中有三種標准輸入輸出,分別是STDIN,STDOUT,
STDERR,對應的數字是0,1,2。
STDIN是標准輸入,默認從鍵盤讀取信息;
STDOUT是標准輸出,默認將輸出結果輸出至終端;
STDERR是標准錯誤,默認將輸出結果輸出至終端。
我們常用的 2>&1,指將標准輸出、標准錯誤指定為同一輸出路徑 。
python中,我們可以使用print方法來輸出信息。\
我們看下print函數的定義:
print函數將 objects 列印到 file 指定的文本流,以 sep 分隔並在末尾加上 end。 sep, end, file 和 flush 如果存在,那麼必須以關鍵字參數的形式給出。
所有非關鍵字參數都會被轉換為字元串,並會被寫入到流,以 sep 分割,並在末尾加上 end。 sep 和 end 都必須為字元串;它們也可以為 None,這意味著使用默認值。 如果沒有給出 objects,則 print() 將只寫入 end。
file 參數必須是一個具有 write(string) 方法的對象;如果參數不存在或為 None,則將使用 sys.stdout。 由於要列印的參數會被轉換為文本字元串,因此 print()不能用於二進制模式的文件對象。 對於這些對象,可以使用 file.write(...)。
輸出是否被緩存通常決定於 file,但如果 flush 關鍵字參數為真值,輸出流會被強制刷新。
可以看到print的輸出格式還是比較簡單的。我們接下來看一下怎麼豐富輸出的格式。
如果想要格式化字元串,可以在字元串的開始引號之前加上 f 或 F。
這樣的話,我們可以直接在字元串中引入變數值,只需要把變數放在 { 和 } 中間即可。
除了在{ }中放入Python變數之外,還可以在其中放入函數:
在 ':' 後傳遞一個整數可以讓該欄位成為最小字元寬度。方便列對齊:
{ }中的變數後面還可以跟著轉值符號:'!a' 表示應用 ascii() ,'!s' 表示應用 str(),還有 '!r' 表示應用 repr():
除此之外,str本身自帶一個功能強大的format 函數:
調用此方法的字元串可以包含字元串字面值或者以花括弧 {} 括起來的替換域,每個替換域可以包含一個位置參數的數字索引,或者一個關鍵字參數的名稱。 返回的字元串副本中每個替換域都會被替換為對應參數的字元串值。
再看一個使用索引的例子:
看一個關鍵字的例子:
再看一個組合的例子:
還有非常復雜的組合的例子:
或者使用 '**' 符號將 table 作為關鍵字參數傳遞:
還可以使用n類型 '{:n}' 來格式化數字:
如果我們只是想要將Python對象轉換為字元串,那麼可以使用repr()或者str(), str() 函數是用於返回人類可讀的值的表示,而 repr()是用於生成解釋器可讀的表示。
舉個例子:
str對象還提供了一些對字元串進行手動格式化的方法:
字元串對象的 str.rjust()方法通過在左側填充空格來對給定寬度的欄位中的字元串進行右對齊。類似的方法還有 str.ljust()和 str.center()。
如果輸入的字元串太長,它們不會截斷字元串,而是原樣返回。
如果想保證字元串的長度,則可以使用切片: x.ljust(n)[:n] 。
還可以使用str.zfill()來用0填充字元串:
% 也可以用來格式化字元串,給定 'string' % values,則 string 中的 % 實例會以零個或多個 values 元素替換。 此操作通常被稱為字元串插值。
python中文件讀取非常簡單,使用open()方法即可。
open()會返回一個文件對象。我們看一下它的定義:
第一個參數是文件名。
第二個參數是文件打開的模式,可用的模式有:
默認模式為 'r' 。
看一個open文件的例子:
文件打開了,自然需要被關閉,所以我們需要顯示調用 f.close() 方法:
有沒有類似java中的try with resource的自動關閉文件的功能呢?
我們可以使用with,這樣文件在使用完畢之後,會自動被關閉,非常的好用。
文件被關閉之後,如果想要再次讀取,就會報錯:
獲取到文件對象之後,我們就可以調用文件中的方法了。
f.read(size) 會讀取一些數據並將其作為字元串(在文本模式下)或位元組串對象(在二進制模式下)返回。
size 是一個可選的數值參數。 當 size 被省略或者為負數時,將讀取並返回整個文件的內容;當取其他值時,將讀取並返回至多 size 個字元(在文本模式下)或 size 個位元組(在二進制模式下)。 如果已到達文件末尾,f.read() 將返回一個空字元串 ('')。
f.readline() 從文件中讀取一行;換行符(\n)留在字元串的末尾,如果文件不以換行符結尾,則在文件的最後一行省略。如果 f.readline() 返回一個空的字元串,則表示已經到達了文件末尾,而空行使用 '\n' 表示,該字元串只包含一個換行符。
還有一種更加簡單的讀取方法,就是從文件中遍歷:
如果你想以列表的形式讀取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。
f.write(string) 會把 string 的內容寫入到文件中,並返回寫入的字元數。
如果是在文本模式下,那麼在寫入文件之前,需要把對象轉換成為文本形式,我們可以使用str()來進行轉換。
使用f.seek(offset, whence)可以定位文件指針的位置,然後後續會從該位置開始進行讀取操作。
whence 的 0 值表示從文件開頭起算,1 表示使用當前文件位置,2 表示使用文件末尾作為參考點。 whence 如果省略則默認值為 0,即使用文件開頭作為參考點。
JSON是一個很方便進行信息交流的文件格式。我們看下怎麼使用JSON來將對象轉換為字元串:
mps是將對象轉換為json str。 json還有一個mp方法,可以直接將對象存入到文件中。
要從文件中解析出json字元串,可以使用load:
JSON 中的鍵-值對中的鍵永遠是 str類型的。當一個對象被轉化為 JSON 時,字典中所有的鍵都會被強制轉換為字元串。這所造成的結果是字典被轉換為 JSON 然後轉換回字典時可能和原來的不相等。換句話說,如果 x 具有非字元串的鍵,則有 loads(mps(x)) != x。
❾ python程序出現 IOError: [Errno 0] Error 提示
ifcho==1:
modify=raw_input('芹此則請輸入替換內容:')
嫌棚content2=content.replace(want,modify)
o.write(content2)
這樣試扒沖試
❿ python中 IO.open 和直接open 有什麼區別
IO.open使用的是函數打開文件,一般來說使用IO.open會相對快些,效率高些