Моя цель для этого сценария — взять папку, полную текстовых файлов, захватить каждую строку во всех файлах, а затем вывести один файл, содержащий каждую уникальную строку в порядке убывания частоты.
Он не просто находит уникальные строки, он определяет, как часто каждая уникальная строка появляется во всех файлах.
С помощью этого скрипта нужно обрабатывать МНОГО текста - по крайней мере, около 2 ГБ, поэтому мне нужно, чтобы это было сделано эффективно. Пока я не достиг этой цели.
import os, sys #needed for looking into a directory
from sys import argv #allows passing of arguments from command line, where I call the script
from collections import Counter #allows the lists to be sorted by number of occurrences
#Pass argument containing Directory of files to be combined
dir_string = str((argv[1]))
filenames=[]
#Get name of files in directory, add them to a list
for file in os.listdir(dir_string):
if file.endswith(".txt"):
filenames.append(os.path.join(dir_string, file)) #add names of files to a list
#Declare name of file to be written
out_file_name = dir_string+".txt"
#Create output file
outfile = open(out_file_name, "w")
#Declare list to be filled with lines seen
lines_seen = []
#Parse All Lines in all files
for fname in filenames: #for all files in list
with open(fname) as infile: #open a given file
for line in infile: #for all lines in current file, read one by one
#Here's the problem.
lines_seen.append(str(line).strip('\n')) #add line to list of lines seen,
#removing the endline
#Organizes the list by number of occurences, but produced a list that contains
# [(item a, # of a occurrences ), (item b, # of b occurrences)...]
lines_seen = Counter(lines_seen).most_common()
#Write file line by line to the output file
for item in lines_seen: outfile.write(str(item[0])+"\n")
outfile.close()
Когда я получаю сообщение об ошибке, речь идет о строке lines_seen.append(str(line).strip('\n'))
.
Сначала я попытался добавить строки без преобразования в строку и удаления, но это включало бы видимый «\n» в строку, что было для меня неприемлемо. Для меньших списков преобразование в строку и удаление не требовало больших затрат памяти. Я не мог найти более эффективного способа избавиться от символа конца строки
На моем ПК это вызывает MemoryError
, на моем Mac это дает мне Killed: 9
— еще не пробовал в Linux.
Нужно ли мне преобразовать в двоичный файл, собрать мой упорядоченный список, а затем преобразовать обратно? Как еще это можно сделать?
EDIT. Стало ясно, что для меня лучший способ сделать это с помощью команд unix
cd DirectoryWithFiles
cat *.txt | sort | uniq -c | sort -n -r > wordlist_with_count.txt
cut -c6- wordlist_with_count.txt > wordlist_sorted.txt
List
в памяти, почему бы не записать свои строки во временный файл? - person Nishanth Matha   schedule 22.03.2017beat the purpose
как я удивляюсь, что вы все еще получаете общее количество вхождений по всему каталогу ... это только то, что вы создаете промежуточный буфер для чтения и сортировки по частям, но ваш конечный результат все равно будет таким, как вы хотите - person Nishanth Matha   schedule 22.03.2017sort(1,2)
, затемsort(2,3)
, затем сноваsort(1,2)
, что даст вамsort of (1,2,3)
, вы будете использовать логику, аналогичную этой stackoverflow.com/questions/42893884/ - person Nishanth Matha   schedule 22.03.2017