我有一個文本文件,它的長度爲10k行,我需要構建一個函數,每次從該文件中提取10個隨機行。我已經找到了如何使用numpy在Python中生成隨機數字,以及如何打開文件,但我不知道如何將它們混合在一起。請幫忙。從文件中檢索10個隨機行
回答
如果你知道你的文件是正是 10K 線長,那麼你可以使用linecache:
import random
import linecache
def random_lines(filename)
idxs = random.sample(range(10000), 10)
return [linecache.getline(filename, i) for i in idxs]
此方法返回10個隨機行的列表,您可以用打印:
for line in random_lines('file.txt'):
print line
嘗試linecache:
import linecache
#put your 3 randoms into an array in whichever way you are doing it
lines = [3,45,678] #use your existing code here
for i in lines:
linecache.getline('/etc/file', i)
不知道文件有多長時間,他怎麼知道範圍來生成隨機數? – abarnert
你可以使用這個代碼不關心文件的長度,但在極少數情況下你可能會得到重複:
from random import choice
lines = [a.strip() for a in open("yourfile").readlines()]
result = [choice(lines) for a in range(10)]
result
是含有名爲yourfile
文件隨機選擇10行的列表。
對於小至10的範圍,'xrange(10)'可能會是_lowlow_,而不是更快......並且很難相信這種差異會以任何方式出現。 – abarnert
從Apple 64位CPython 2.7.2的快速測試中,我得到了範圍(10)中的'%timeit':pass''需要17.1ns,我在xrange(10)中使用'%timeit':pass''需要18.1ns。當然你通過創建列表浪費了整個92字節,但是很難想象它會在哪裏重要...... – abarnert
@abarnert感謝您告訴我,我實際上並不知道xrange()在某些情況下可能會變慢;我更新了我的答案。 – 2013-08-27 02:10:35
如果您知道該文件有多長行,可以使用linecache
,如其他答案所示。但只知道它的大小是10K就不會告訴你它有多長的行數。
如果知道該文件是小到足以放入內存和一個10K的文件很容易足夠小,只是將它讀入內存:
import random
with open('file.txt') as f:
lines = list(f)
for i in range(10):
print(random.choice(lines))
但是,如果你不知道多久文件是,並且不能將它全部讀入內存?然後,你需要做兩關:
import linecache
import random
with open('file.txt') as f:
linecount = sum(1 for line in f)
for i in range(10):
print(linecache.getline('file.txt', random.range(linecount)))
注意,這兩個會在每行結束離開換行。如果你想擺脫這些,你可以將第一個例子從list(f)
更改爲[line.rstrip() for line in f]
,或者在print
中調用rstrip()
,或在print
中使用end=''
(Python 3.x)或尾隨逗號(Python 2.x) 。對於linecache
示例,第一個顯然不起作用,但您仍然可以執行其他任何一個。
另外請注意,我用的,而不是在這裏使用numpy
的STDLIB random
庫。如果您只是生成10個隨機數字以用於普通Python代碼,則沒有理由使用numpy
。 (另一方面,如果您在此處做有一個很好的理由使用numpy
,您可能需要將行讀入pandas
表中,並將隨機索引應用於該表。)
感謝和抱歉的困惑,我的意思是10000lines,如果我被允許,我會upvote。 – user2719565
如果你不知道你的文件的行數,你可以數得過來,例如,此代碼:
line_count = 0
with open(filename) as file:
for line in file:
line_count += 1
然後,您將能夠產生內的隨機數範圍[0, line_count)
:
import random
lines_to_read = []
for i in range(10):
line = random.randint(0, line_count - 1)
lines_to_read.append(line)
最後,再次讀取該文件,選擇隨機選擇這些線路,做任何你想要它們,例如,打印出來:
with open(filename) as file:
for index, line in enumerate(file):
if index in lines_to_read:
print line
我希望它能幫助你!乾杯!
可以用一遍完成這項工作,也不需要將整個文件加載到內存中。儘管代碼本身將變得更加複雜並且大部分都是不需要的,除非該文件是巨大的。
訣竅如下:
假設我們只需要一個隨機線,那麼首先救人第一線到一個變量,那麼對於第i行,以概率1替換當前/我。到達文件結尾時返回保存的行。 對於10個隨機行,然後有10個元素的列表,併爲該文件中的每一行執行10次處理。
- 1. 檢索隨機行()
- 2. 在FLEX/Prolog項目中從Prolog文件中檢索隨機數
- 3. C++中從-10到10的隨機數
- 4. 如何從json文件中檢索隨機問題?
- 5. 如何從保存的文件中檢索隨機數字? (Java)
- 6. 可能從MongoDB中檢索多個隨機,非順序文檔?
- 7. 從SQLLite中檢索隨機數據
- 8. 從ArrayList中檢索隨機對象
- 9. 從文件中擷取隨機行
- 10. 從文件中隨機選擇一行
- 11. 從字符串中的ID中檢索表中的隨機行
- 12. 從固定種子文件中選取隨機行(僞隨機)
- 13. Mysqli輸出10個隨機行
- 14. 來自excel的10個隨機行
- 15. 批處理文件 - 隨機10位數
- 16. 從文本文件中檢索隨機預格式化的文本
- 17. 從文本文件中返回一個隨機行
- 18. 如何從postgreSQL表中檢索隨機數據行?
- 19. 試圖從一個隨機行從一個文本文件中添加文本
- 20. 從Haskell中的文件中挑選一個隨機行
- 21. 如何從python中的一個文件中讀取隨機行?
- 22. 從最好的行中返回隨機行(即:100行 - >最佳10 - >獲得5個隨機)
- 23. 如何從隨機挑選的多個文件執行文件?
- 24. 如何從NSSet實例中檢索一個隨機對象?
- 25. 從數組中檢索x個隨機元素
- 26. 如何從存儲過程中檢索N個隨機記錄?
- 27. 在jQuery事件後檢索隨機數
- 28. 從SQL隨機順序檢索隨機數據到一個標籤
- 29. 檢索隨機數據
- 30. Python從文件中獲取多個隨機行
你的意思是10000行或10KB大小的文件? – elyase
對不起,我的意思是10000行。 – user2719565
我改變了問題,謝謝。 – user2719565