Как я могу взять определенную строку в большом файле, который имеет много похожих строк, используя Python?

1

имеют разные файлы с одинаковым именем, в разных каталогах. В этих файлах есть строки, которые почти равны, я бы хотел вынуть только последнюю строку из них (после нее больше строк) и записать ее в другой файл.

До сих пор я сделал:

#!/usr/bin/env python

import os

def cd_grep():
   for file in os.listdir("."):
     if os.path.isfile(file):
       for line in open("graph.txt"):
                  if " 4.49" in line:                               
                       line_list=[line] 
   g = open('comparation','a') 
   g.write ("%s" % (line[0:4]))
   g.close()
os.chdir('4.294')
cd_grep()
os.chdir(os.pardir)
os.chdir('4.394')
cd_grep()
os.chdir(os.pardir)
os.chdir('4.494')
cd_grep()
os.chdir(os.pardir)
os.chdir('4.594')
cd_grep()
os.chdir(os.pardir)
os.chdir('4.694')
cd_grep()

Я создал список, потому что я собираюсь взять только определенную информацию всей строки.

Наконец, я понял, что эта процедура работает только для небольших файлов и только в том случае, если последняя строка файла содержит термин, который я ищу. Для больших файлов я получил это сообщение (внутри файла, на который я надеялся получить строку):
               Коммутаторы добровольного контекста: 3403

Любая идея или предложение будут очень оценены.

  • 2
    Прежде всего, отформатируйте ваш код, чтобы он был читабельным и с отступом.
  • 0
    Хорошо спасибо. Впервые я задал вопрос здесь. Я надеюсь, что теперь лучше.
Показать ещё 5 комментариев
Теги:
text
readline

2 ответа

2
Лучший ответ

Не уверен в ошибке, которую вы получаете (после вашего последнего редактирования).

Я попытался немного переписать код, надеюсь, что он даст вам результат, похожий на то, что вам нужно (ВНИМАНИЕ: не проверено).

with open ('comparation', 'a') as write_file:
  for path, dirs, files in os.walk(os.getcwd()):
    for filename in [f for f in files if f == "graph.txt"]:
      filepath = os.path.abspath(os.path.join(path, filename))
      with open(filepath) as f:
        for line in f:
          if " 4.49" in line:
            last = line
        write_file.write("File: %s, Line: %s\n" % (filepath, last[0:4]))        
  • 0
    Это сработало довольно хорошо. Единственная проблема была, по какой-то причине, это дает мне тот же результат, много раз. Файл: / path1 /, строка: xxxxxx Файл: / path1 /, строка: xxxxxx Файл: / path1 /, строка: xxxxxx Файл: / path1 /, строка: xxxxxx Файл: / path2 /, строка: гггггг Файл: / path2 / , строка: гггггг Файл: / путь2 /, строка: гггггг Файл: / путь2 /, строка: гггггг Должен ли я писать файл (сравнение) вне цикла?
  • 0
    Извините, я не могу это проверить. Я думаю, что вы должны быть в состоянии экспериментировать с ним в интерактивном интерпретаторе Python; без тестовых папок / файлов я не могу вам ответить хорошо. Я также забыл добавить "\ n" при добавлении в файл (добавлен сейчас), который, кажется, сделал одну длинную строку в файле write_file. Надеюсь, теперь это работает лучше; Получайте удовольствие от настройки.
Показать ещё 1 комментарий
0

Я предполагаю, что вы не закрываете свои файлы.

def cd_grep():
    for file in os.listdir("."):
        if os.path.isfile(file):
           graph_file = open('graph.txt'):
           for line in graph_file:
               if " 4.49" in line:                               
                   line_list=[line] 
           graph_file.close()
    g = open('comparation','a') 
    g.write ("%s" % (line[0:4]))
    g.close()

Или гораздо лучше использовать with для открытия (и всегда закрытия) ваших файлов.

def cd_grep():
    for file in os.listdir("."):
        if os.path.isfile(file):
           with open('graph.txt') as graph_file:
               for line in graph_file:
                   if " 4.49" in line:                               
                       line_list=[line] 
    with open('comparation','a') as g:
        g.write ("%s" % (line[0:4]))
  • 0
    Большое спасибо за внимание и советы. Тем не менее он занимает последнюю строку файла, даже если это не правильная строка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню