2016-10-18 6 views
0

У меня есть назначение, которое включает в себя создание хвоста для поиска последних K строк в файле. Для этого нам был предоставлен буфер. На данный момент я пытаюсь писать мелкие вещи и искать в файле "\n" символов. Я сталкиваюсь с несколькими проблемами. В python мой код вертел и в python3 его a . Текстовый файл имеет WAY больше, чем это. Может кто-нибудь, пожалуйста, скажите мне, почему это не работает, как мне хотелось бы?Поиск новых символов строки в текстовом файле

def new(): 
    try: 
     f = open("test.txt", "r") 
     count = 0 
     for i in f: 
      if i == "\n": 
       count = count + 1 
     return count 
     f.close() 
    except(FileNotFoundError): 
     print("No file")  

То, что я хотел бы сделать, это использовать стремятся вернуться назад в файл и каждый так часто ищут новые строки символов, но это даже не похоже на работу для меня.

+1

'for i in f' выполняет итерации по строкам в файле, а не символы. – sytech

+0

@Gator_Python Спасибо. Я думал, что цикл for будет перебирать каждый символ в файле. Спасибо. –

ответ

1

for i in f: не делает, что вы думаете. Итератор по умолчанию для файла дает lines, а не characters. Итак, вы говорите: «Вся ли линия равна только возвращению?»

Попробуйте вместо этого сделать if i[-1] == "\n":, так как это говорит: «Является ли последний символ в строке символом новой строки?»

Возможно, вы заметили, что это тривиально верно, так как каждая «линия» заканчивается новой строкой, поэтому достаточно просто подсчета строк.


Если вы хотите перебрать отдельных символов, я хотел бы сделать:

for line in file: 
    for char in line: 
     dostuff() 

Именование переменных, что вы думаете, они также помогут устранить, если они в конечном итоге не то, что вы думали ,


Пример по repl.it. Переменные называются line и char, чтобы показать их, они могут быть banana и henry так же легко, хотя тогда было бы менее ясно, что происходит. raven имитирует файл для целей данного примера.

+0

Спасибо. Я думал, что когда вы повторили через файл, он будет делать каждый символ внутри этого файла. Индекс -1 работал как шарм. Есть ли такой способ для итерации каждого символа или вам нужно было бы что-то вроде open (, «rb») читать биты? –

+0

спасибо. В этом есть смысл. –

+0

@DirtyDaver Я обновил его, чтобы указать, как я буду сканировать файл для символов. – TemporalWolf

0

Гораздо более простой подход был бы

  • использование Python встроенного в способности разделить файл в список строк
  • создать свой хвост из последних K элементов этого списка

Если сохранить весь файл в массиве, это проблема, вы можете вместо этого прочитать файл по строкам, но сохранить только последние строки K, чтобы, когда вы доходите до конца файла, у вас есть хвост вы хотите.

0

Почему бы не упростить логику и использовать встроенный Python?

def new(): # not a good function name! 
    try: 
     with open('data1.txt') as f: 
      return f.read().count('\n') 
    except FileNotFoundError: 
     print ("No file") 
+0

Задания обычно требуют, чтобы вы сделали это самостоятельно -> если бы вернули однострочное понимание, они, вероятно, (по праву) предположили бы, что он сам не написал его, хотя это был бы мой метод по умолчанию. – TemporalWolf

+0

@TemporalWolf правильный, мы можем использовать только то, чему нас учили, даже если мы знаем больше. Мне нравится этот метод, и я буду помнить об этом. Спасибо за ответ. Я только написал функцию new() только потому, что пытался ее протестировать, прежде чем на самом деле добавить его в свой код и дать ему имя functino, например GetCharacters() или что-то в этом роде. –

Смежные вопросы