![](/img/trans.png)
[英]How to remove all lines from a large text file (>60GB) that contains a specific alphabet in python?
[英]How to read data corresponds to specific line numbers from a 60GB text file in python?
我有一个60GB大小的文本文件(10亿行)。 我必须提取对应于指定行号的数据,这些行号可以从另一个文本文件中读取(例如:1,4,70,100 ......等)。 由于大小我无法将数据加载到内存然后提取行。 此外,逐行匹配和提取将花费许多天的时间。 这个问题有解决方案吗?
我试过的两种方法:
第一种方法
f = open('line_numbers.txt')
lines = f.readlines()
numbers =[int(e.strip()) for e in lines]
r = max(numbers)
file = open('OUTPUT_RESULT.txt','w')
with open('Large_File.txt') as infile:
for num, line in enumerate(infile,1):
if (num<= r):
if (num in numbers):
file.write(line)
else:
pass
print(num)
获得结果需要很多天
2.第二种方法
import pandas as pd
data = pd.read_csv('Large_File.txt', header=None)
file = open('OUTPUT_RESULT.txt','w')
f = open('line_numbers.txt')
lines = f.readlines()
numbers =[int(e.strip()) for e in lines]
x = data.loc[numbers,:]
file.write(x)
它不会将文件加载到内存中
有没有解决方案可以解决这个问题?
您的问题可能是if (num in numbers)
行。 它不仅不需要括号,而且每次迭代都会检查它,即使您的代码按顺序遍历文件(第1行,第2行,等等)。
这可以很容易地进行优化并且这样做,下面的代码在大约5000万行的测试文件上仅运行12秒。 它应该在几分钟内处理您的文件。
import random
numbers = sorted([random.randint(1, 50000000) for _ in range(1000)])
outfile = open('specific_lines.txt', 'w')
with open('archive_list.txt', 'r', encoding='cp437') as infile:
for num, line in enumerate(infile, 1):
if numbers:
if num == numbers[0]:
outfile.write(line)
print(num)
del numbers[0]
else:
pass
注意:这会生成1,000个随机行号,替换为您的示例中加载的数字。 如果您的数字列表要大得多,则输出文件的写入时间会稍微增加执行时间。
你的代码就像:
with open('line_numbers.txt') as f:
lines = f.readlines()
numbers = sorted([int(e.strip()) for e in lines])
outfile = open('specific_lines.txt', 'w')
with open('archive_list.txt', 'r', encoding='cp437') as infile:
for num, line in enumerate(infile, 1):
if numbers:
if num == numbers[0]:
outfile.write(line)
print(num)
del numbers[0]
else:
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.