我們試圖從非常大的文件中獲取大約1M的隨機行,其中可能有大約3M記錄。所選的隨機行需要寫入第三個文件。 您對我們有任何建議嗎?Python - 從一個非常大的文件中讀取隨機行並追加到另一個文件
回答
您可以使用readlines()並將該文件轉儲到列表中。那麼你可以簡單地生成一百萬個隨機數字。當然,它們必須位於文件列表大小的範圍內,並且每次生成一個隨機數就可以訪問列表中該位置的行,並將其寫入要移動的文件中in。
OP表示這個文件非常大,因爲它將整個文件讀入內存,所以會排除'readlines'。 –
@FranciscoCouzo除非他們是典型的noob,他認爲幾兆字節非常大。多次看過。 –
嘿,我以爲你刪除了你的,所以我寫了我的!無論如何,我同意。 +1等等......我舉了一個例子,所以我認爲我也會保持我的。 – tdelaney
3百萬條記錄,比如說100個字符行並不是很大 - 這完全取決於你使用的硬件。你可以這樣做:
import random
with open('input.txt') as infile, open('output.txt', 'a') as outfile:
outfile.writelines(random.sample(infile.readlines(), 1000000))
這是一個更快的方法來做到這一點,它的簡單。那麼,這是一個看看它是否適合你的問題。
以供將來參考,因爲其他的答案已經給了,對於適合在內存的工作負載工作的解決方案:
import random
def reservoir_sampling(l, k):
it = iter(l)
try:
result = [next(it) for _ in range(k)] # use xrange if on python 2.x
except StopIteration:
raise ValueError("Sample larger than population")
for i, item in enumerate(it, start=k):
s = random.randint(0, i)
if s < k:
result[s] = item
random.shuffle(result)
return result
with open('input.txt') as infile, open('output.txt', 'a') as outfile:
for line in reservoir_sampling(infile, 1000000):
outfile.write(line)
的算法稱爲水庫取樣,並且需要O(n)
時間和O(k)
內存,這取決於你需要你可能需要也可能不需要撥打random.shuffle
。
- 1. 如何從python中的一個文件中讀取隨機行?
- 2. C:如何從一個文件中讀取一行,然後將其追加到另一個文件中?
- 3. 閱讀一個非常大的文件
- 4. PHP讀取並從另一個文件
- 5. 從一個非常大的文件中從命令行中挑選一個隨機行
- 6. 在Python中從一個文件讀到另一個文件並寫入另一個文件
- 7. 讀一個大文本文件,並選擇行復制到另一個文件
- 8. 從文件讀取特定行並寫入python中的另一個文件
- 9. 在Matlab中讀取一個非常大的文本文件(〜30Gb)
- 10. 從Lucene的非常大的文件中獲取隨機行
- 11. java從一個文件中讀取某個文件到另一個文件
- 12. 從文件讀取並打印到另一個文件
- 13. 隨機將文件從一個文件夾移動到另一個文件夾?
- 14. 一個非常大(50GB +)ASCII文件,提供隨機讀取訪問
- 15. 複製文件並追加到另一個文件
- 16. 從文本文件中隨機讀取一行的函數
- 17. 從ZIP文件讀取文件並將其寫入到另一個文件
- 18. PYTHON:從2個文件交替讀取行並追加到第三個
- 19. 追加內容從一個文件到另一個Linux的
- 20. 從另一個文件讀取多行到一個元組
- 21. 從文件中讀取字符並寫入另一個文件
- 22. 追加一個文本文件到另一個在Java中
- 23. 文件I/O:從一個文件讀取並寫入另一個文件(Java)
- 24. 從另一個HTML文件追加DIV
- 25. 將文件從一個tar文件添加到另一個python文件中
- 26. Python,如何隨機添加/追加元素從一個列表到另一個?
- 27. 試圖從一個隨機行從一個文本文件中添加文本
- 28. 如何從另一個python文件運行一個python文件?
- 29. NetUtil.asyncCopy從一個文件追加到另一個Firefox擴展
- 30. 逐行讀取文件並追加字
你想選擇一條沒有偏見的線嗎?因爲如果沒有,你可以很容易地找到一個隨機的位置,然後找到一個'\ n'。 –
你的第一句話寫得不好,我不明白。 「行」和「記錄」之間的關係是什麼?源文件中有多少行/記錄?你想要在輸出文件中有多少個?行/記錄有多大? –
@FranciscoCouzo這是一個有趣的想法,但也有風險輸出同一行多次,除非你跟蹤你已經找到哪個'\ n'並跳過它們。我認爲這會增加它自己的偏見(如果隨機數字恰好彼此接近,那麼會有所偏差),但是自從我研究了統計數據以來,它已經太長了! – tdelaney