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