2013-09-15 2 views
-5

Я пытаюсь найти несколько строк в файле, но line.find() не возвращает true для любой строки в файле. Пожалуйста, попробуйте что-нибудь предложить. Поиск должен быть последовательный, и мне нужно сохранить значение смещения для каждой найденной строки. и поиск следующей строки должен начинаться с этого смещения.Файл I/O python

def CheckFile(*argv): 
    import os 
    Filename = argv[0] 
    Search = argv[1] 
    Flag = False 
    FileFlag = False 
    offset1 = 0 
    offset2 = 0 
    if os.path.exists(Filename) == 0: 
    return "File Doesn't exist", 1 
    else: 
    fh = open(Filename,"r") 
    for line in fh: 
     if Search in line: 
     print "Success" 
     print (line) 
     Flag = True 
     offset1 = fh.tell() 
     #offset1 = int(offset1) 
     break 
     else: 
     fh.close() 
     return "Could not find String %s"%(Search), 1 
     #fh.close() 
    if Flag: 
     fh = open(Filename,"r") 
     print(offset1) 
     fh.seek(offset1) 
     for line in fh: 
     if "TestDir1\TestFile1.txt" in line: 
      print "Success" 
      print (line) 
      FileFlag = True 
      offset2 = fh.tell() 
      #offset2 = int(offset2) 
      break 
     else: 
      fh.close() 
      return "Couldn't Find File TestDir1\TestFile1.txt", 1 
      #fh.close() 
    if Flag and FileFlag: 
     fh = open(Filename,"r") 
     print(offset2) 
     fh.seek(offset2) 
     for line in fh: 
     if "Persistent Handle: True" in line: 
      print "Success" 
      return "Success -- Found the strings", 0 
     else: 
      fh.close() 
      return "Failur -- Failed to find 'Persistent Handle: True'", 1 

вывод:

>>> CheckFile("D:\wireshark.txt","NetBIOS") 
('Could not find String NetBIOS', 1) 

Вот пример файл:

> [SEQ/ACK analysis] 
>  [This is an ACK to the segment in frame: 104] 
>  [The RTT to ACK the segment was: 0.043579000 seconds] 
>  [Bytes in flight: 252] 
>NetBIOS Session Service 
> Message Type: Session message (0x00) 
> Length: 248 
>SMB2 (Server Message Block Protocol version 2) 
> SMB2 Header 
>  Server Component: SMB2 
>  Header Length: 64 
>  Credit Charge: 1 
>  Channel Sequence: 0 
     Reserved: 0000 
     Command: Create (5) 
     Credits requested: 1 
     Flags: 0x00000000 
+2

Какие строки вы ищете, в каком вводе? – millimoose

+1

Также подумайте о том, чтобы сделать ваш код менее спагетти. Это было бы проще отладить, если вы разделили код на файл ввода-вывода (открыть файл, проверить его существование, yadda blah) и алгоритм поиска (который принимает только итератор по строкам или по строкам/смещениям). Таким образом, вы могли бы по крайней мере локализовать свою ошибку вместо того, чтобы сбросить стену кода на SO. – millimoose

+0

Я забираю строку с именем «NETBIOS» и существует в файле. Я тоже должен приложить файл. Я новичок и до сих пор учился! – user2781569

ответ

1

Вы используете неправильный тест; использовать in для проверки значений в строке:

if Search in line: 

line.find(Search) будет только справедливо, если либо значением Search является не в строке или, если он находится в линии в положении, отличном от начала.

str.find() возвращает -1, если значение не найдено, или целое положение в противном случае. Это означает, что если lineначинает со значением Search, 0 возвращается, и 0 тестов, как ложные в логическом контексте, например, if:

>>> 'hello'.find('hello') 
0 
>>> if 'hello world'.find('hello'): 
...  print 'Found but not found?' 
... else: 
...  print 'That did not come out the way you thought it would' 
... 
That did not come out the way you thought it would 
>>> 'hello' in 'hello world' 
True 

Далее, для любой строки в файле вашего тест возвращает False , то вы близко файл:

else: 
    fh.close() 

, который завершает цикл рано; Большинство строк не соответствуют вашему тесту, вы действительно не хотите быстро закрыть файл.

Вы также всегда выполнить линию return "Could not find String %s"%(Search), 1; Вы хотите, чтобы проверить, если Flag является False:

if not Flag: 
    return "Could not find String %s"%(Search), 1 

Вы можете перестроить поиск использовать else ветвь for цикла:

with open(Filename,"r") as fh: 
    for line in fh: 
     if Search in line: 
      print "Success" 
      print (line) 
      offset1 = fh.tell() 
      break 
    else: 
     return "Could not find String %s"%(Search), 1 

break предотвращает else блока от запуска. Блок with позаботится о закрытии файла для вас, используя файловый объект в качестве менеджера контекста.

+0

Я тоже пробовал это ... не работает с вышеупомянутым кодом – user2781569

+0

@ user2781569: Вы уверены, что исправили это во всех местах? Как сейчас, 'line.find()' ошибочно *. –

+0

@ user2781569: Обратите внимание, что ни 'str.find()', ни 'in str' не будет искать регистр без учета регистра; если вы ищете 'hello', но строка содержит' Hello', то никакое совпадение не будет сделано. –