python只读打开文件_关于python:只读文件的第一行?
如何使用python只得到文件的第一行作為字符串?
如果您已經閱讀了文件("在閱讀了文件之后"),那么您已經閱讀了第一行!(假設至少有一行。)
請注意,現在所說的問題與原來的含義不同。有些答案現在看起來很愚蠢,因為他們考慮到了"在文件中閱讀后"部分(已刪除)。
使用.readline()方法(python 2 docs,python 3 docs):
with open('myfile.txt') as f:
first_line = f.readline()
一些注釋:
如文檔中所述,除非它是文件中的唯一一行,否則從f.readline()返回的字符串將包含一個尾隨新行。您可能希望使用f.readline().strip()來刪除換行符。
當塊結束時,with語句自動再次關閉文件。
with語句僅在python 2.5和更高版本中有效,而在python2.5中,您需要使用from __future__ import with_statement。
在python 3中,您應該為打開的文件指定文件編碼。多讀…
在python 3中,如果文件是ascii或utf8,則不必指定文件編碼。如果不是這樣,您應該指定codecs.open在python 2中的編碼。
@evpok"在python 3中,如果文件是ascii或utf8,則不必指定文件編碼"-如果這只是嚴格正確的話!實際情況稍顯混亂;如docs中所述,所使用的默認編碼依賴于平臺(甚至在同一臺計算機上也可能不同,這取決于您如何啟動python——例如,我看到了在我的正常shell中工作的代碼,假設在使用mod_wsgi運行apache時,utf-8隨后會爆炸。
infile = open('filename.txt', 'r')
firstLine = infile.readline()
您沒有關閉文件。使用with的解決方案更好。
fline=open("myfile").readline().rstrip()
我是來找這個的。尤其是因為rstrip()刪除了換行符。
-1;這不會關閉文件,如果第一行除了換行符本身之外還包含任何尾隨空格,則返回錯誤的結果。
@markamery:實際上,因為文件句柄沒有分配給變量,所以它會立即被垃圾收集,從而關閉文件。(當然,使用上下文管理器的公認解決方案仍然更好。)
@acdr您所說的對于cpython是正確的,但對于其他的python實現則不是正確的-請參見pypy垃圾收集文檔,其中提到"文件…如果超出范圍,則不會立即關閉。出于這個原因,人們通常認為(例如在stackoverflow.com/a/7396043/1709587上),依賴你描述的行為是不好的做法。
應該這樣做:
f = open('myfile.txt')
first = f.readline()
first_line = next(open(filename))
這也會關閉文件嗎?
最后,當python離開塊時。
要返回打開文件的開頭,然后返回第一行,請執行以下操作:
my_file.seek(0)
first_line = my_file.readline()
為了更好地理解,它將是"my_file.seek(0)line=my_file.readline()"
這里還有很多其他答案,但要準確回答您提出的問題(在@markamery去編輯原始問題并改變其含義之前):
>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('
', 1)[0]
換句話說,如果您已經讀取了文件(如您所說),并且在內存中有一大塊數據,那么為了有效地從文件中獲取第一行,只需對換行符執行split(),然后從結果列表中獲取第一個元素。
注意,這不包括行尾的字符,但我假設您無論如何都不想要它(而且一個單行文件甚至可能沒有一個)。另外請注意,雖然它非常短和快速,但它確實會復制數據,因此對于一個真正大的內存塊,您可能不認為它是"高效的"。一如既往,這取決于…
如果這是一個大文件,f.read()將嘗試將整個文件加載到內存中,這不是一個好主意。另一種方法是一次讀取一個字符,直到遇到換行符或EOF為止。
實際上,所有其他的答案都是更好的選擇。通常,使用readline()和朋友讀取一個文件時,會一次加載整個塊,可能是32K的give或take,然后搜索該塊以查找下一個換行符。更快更高效。我的答案只有在他已經加載了全部內容的情況下才有用,在這種情況下,我們可以假設他對所有內容都在內存中是滿意的。
我不相信我改變了意思。在"讀取"整個文件之后,詢問如何"讀取"文件的第一行是毫無意義的。因此,對我來說,很明顯,詢問者的意圖不是假定必須首先調用.read()。
@Markamery,這個問題的措詞很差("相當沒有意義"),所以你猜到了它的意圖("對我來說很明顯"),然后重新修改它來匹配。我的解釋不同。很明顯,在Harpals澄清之前,除非他澄清,否則我們只有原始措辭加上他接受了一個答案(即"seek(0)"),這對我來說清楚地表明他已經閱讀了文件,至少超過了第一行。
你應該刪除這個答案。這不是正確的方法,而且可以欺騙人們。
@謝謝你的意見,但最初的問題是這樣寫的:我的回答是一個技術上有效的回答,而且是一個旨在幫助描述的情況的回答。我確實更新了它,表明這個問題被編輯了,措辭也改變了,我認為我的澄清有助于防止任何人"欺騙"。
:)好吧,我是個懶惰的程序員。我在網上查找了代碼,然后匆忙使用它來嘗試運行一些東西來進行演示。出于某種原因,我的代碼非常慢!花了一段時間才發現,這東西是加載到內存4GB,然后才采取第一行!Tor的答案實際上是"正確的"答案。做事情的方法很多。有些更好。有些更糟。這是一個糟糕的結局。把它放在最上面而不是Tor的答案,這讓我很困擾。我以為因為它在上面,所以最好,所以我沒有檢查…廢話。我想大部分是我的懶惰。
順便問一下,問題是"只讀取文件的第一行?",而不是"如何讀取整個文件并獲取第一行?"
@唐,不,你錯了。當我回答時,問題是"在讀取一個文件之后,如何告訴python只讀取第一行?"我認為這意味著這個家伙已經閱讀了整個文件內容,想知道如何提取第一行。自從這個問題被編輯后,我就非常清楚了。
我認為你把這個問題解釋錯了。"只讀取第一行"……不是"只取第一行",它可以用任何一種方式解釋。我仍然認為應該放棄這個答案的排名。你能想到一個場景,你想用這個來代替托爾的答案嗎?
@唐卡,真的,我們在浪費所有還在讀書的人的時間。你投了反對票,這就是你真正需要做的。至于"任何一種解釋方式",是的,它可能是,這就是為什么我在提供一個選擇一個有效解釋的答案時沒有錯,即使它不可能是最好的解釋。最后,是的,如果所有的數據都是由于其他原因被讀取的,但是您仍然只需要第一行(并且您是一個新手程序員),那么您可能會問這個問題,并發現我的答案很有幫助。請就這樣吧…沒有人會被它迷惑。
解決方案1:
with open('input_file.txt') as input_file:
lines=input_file.readlines()
for line_no, line in enumerate(lines):
if line_no == 0:
print(line)
break
lines包含來自input_file.txt的所有行。
line_no將給出文件中的行號。
如果line_no為0,第一行將作為索引打印。從0開始
同樣,如果你想要第二行,你可以寫if line_no==1。
解決方案2:
with open('input_file.txt') as input_file:
lines=input_file.readlines()
first_line=lines[0]
print(first_line)
lines[0]是第一行。
同樣,lines[1]是第二行
解決方案3:
打印第一行N行。用任何數字替換N。如果你想要第一行,那么n=1
from itertools import islice
with open('my_file.txt','r') as my_file:
head = list(islice(my_file, N))
print(head)
這是unix命令head的等效代碼。
解決方案4:
with open('input.txt', 'r') as fin:
head, tail = fin.read().split('
', 1)
print(head)
#print(tail)
f1 = open("input1.txt","r")
print(f1.readline())
在五年多的時間里,有很多答案都包含著這種方法。你什么都沒做,只是通過添加另一個來制造噪音。
總結
以上是生活随笔為你收集整理的python只读打开文件_关于python:只读文件的第一行?的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: linux显示只读文件系统,linux
 - 下一篇: 常见浏览器清理缓存方法