2015-02-27 6 views
2

Я изучаю код на Python. Теперь я экспериментирую с программой сравнения файлов с here.python: обработка текстового файла, для взаимодействия с контуром цикла и чтения

Мой код:

#!/usr/bin/python3 

def main(): 
    fhand1 = open('mbox.txt') 
    print('file handle for mbox is {}'.format(fhand1)) 
    count = 0 
    for l1 in fhand1: 
     count = count + 1 
     l1 = l1.rstrip() # Skip 'uninteresting lines' 
     if l1.startswith('From:'): 
      print('{}'.format(l1)) 
    print('Numer of lines: {}'.format(count)) 

    fhand2 = open('mbox-short.txt') 
    #inp = fhand2.read(), when here for loop does not work 
    #for l2 in fhand2: 
     #if l2.startswith('From:'): 
      #print('{}'.format(l2)) 
    inp = fhand2.read()#if for loop is active then this doesnot work 
    print('Total characters in mbox-short: {}'.format(len(inp))) 
    print('First 20 characters on mbox-short: {}'.format(inp[:56])) 

if __name__ == "__main__": main() 

Мой вопрос для 'MBox-short.txt'. Когда я положил inp = fhand2.read() до for l2 in fhand2: {}, цикл for не запускается. Когда я меняю последовательность, операция read() не работает.

Может кто-нибудь объяснить это?

Btw, я использую JetBrains PyCharm Community Ed 4 IDE.

Заранее спасибо.

ответ

1

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

Вы должны либо сделать это:

fhand2 = open('mbox-short.txt') 
inp = fhand2.read() # uncomment the first read operation 
for l2 in fhand2: 
    if l2.startswith('From:'): 
     print('{}'.format(l2)) 
# inp = fhand2.read() comment out the second one 

или это:

fhand2 = open('mbox-short.txt') 
inp = fhand2.read() 
for l2 in fhand2: 
    if l2.startswith('From:'): 
     print('{}'.format(l2)) 
fhand2 = open('mbox-short.txt') # re-open the file you have already read 
inp = fhand2.read() 

Смотрите более подробную информацию о питоне я/о here.

0

Метод read() будет считывать полный файл в строку. Так что, если что ваш файл выглядит

1 2 3 4 
5 6 7 8 

Это вернет "1 2 3 4\n5 6 7 8\n". Поэтому, когда вы говорите, for l2 in fhand2, он будет пересекать эту строку. Таким образом, вы в основном просматриваете каждый элемент строки. i.e 1, , 2 и так далее.

Если вы хотите читать построчно, либо использовать readline(), который будет получать вам следующую строку, или использовать readlines(), который будет получать вам список как - ["1 2 3 4\n", "5 6 7 8\n"]

+0

спасибо! Я проверю это. – algoProg

0

Позвонив .read() на объект файла, вы его опорожняете и, следовательно, больше не выполняете цикл над его элементами. Вы можете проверить это, вызывая чтение с необязательным аргументом [size]. Размер mbox-short.txt равен 94626. Вызов, читаемый с помощью 94625, считывает первые 94625 байт вашего файла в строку. Вы можете перебрать оставшийся 1 байт в объект файла (который является символом новой строки \ n). file.read ([size]) по умолчанию считывает весь файл в строку и, следовательно, ничего не перебирает.

filehandle = open("mbox-short.txt") 
    fileString = filehandle.read(94625) 
    print (len(fileString)) 
    count = 0 
    for x in filehandle: 
     print (x) 
     count += 1 
    print (count) 

См: https://docs.python.org/2/library/stdtypes.html?highlight=read#file.read

(я не могу найти file.read() в Python3 документации, но я предполагаю, что он не изменился за версиями)

+0

Спасибо! Невозможно повысить его из-за низкой репутации, но это было полезно для понимания концепции. – algoProg

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

  • Нет связанных вопросов^_^