Вот мой код:

import re


def get_email_answers(path):
    for line in path:
        clear = line.strip()
        if re.match(r".*\s.*\t(Antw.+)\t.*Uhr", clear):
            subject = re.findall(r".*\s.*\t(Antw.+)\t.*Uhr", clear)
            print(subject)


def get_sizes(path):
    for line in path:
        clear = line.strip()
        if re.match(r".*\s([0-9][0-9]\s[MKG]B)", clear):
            size = re.findall(r".*([0-9][0-9]\s[MKG]B)", clear)
            print(size)
        elif re.match(r".*\s([0-9][0-9][0-9]\s[MKG]B)", clear):
            size = re.findall(r".*([0-9][0-9][0-9]\s[MKG]B)", clear)
            print(size)
        elif re.match(r".*\s([0-9]\s[MKG]B)", clear):
            size = re.findall(r".*([0-9]\s[MKG]B)", clear)
            print(size)
        elif re.match(r".*(.\.[0-9][0-9]\s[MKG]B)", clear):
            size = re.findall(r".*(.\.[0-9][0-9]\s[MKG]B)", clear)
            print(size)


file_opener = open(r"C:\Users\julia\Documents\RegEX-Test.txt", "r")
get_sizes(file_opener)
get_email_answers(file_opener)

Функция get_sizes работает, а функция get_email_answers - нет. Если вы закомментируете функцию get_sizes out, тогда get_email_answers работает отлично. Если вы поместите get_email_answers перед get_sizes , тогда get_sizes не будет работать, а get_email_answers .

Я сделал это:

def get_email_answers(path):
    print(path) #modified here
    for line in path:
        print("line") #and here
        clear = line.strip()
        if re.match(r".*\s.*\t(Antw.+)\t.*Uhr", clear):
            subject = re.findall(r".*\s.*\t(Antw.+)\t.*Uhr", clear)
            print(subject)

Печатный путь такой же, как в get_sizes . Но цикл for не запускался! Почему? И почему это происходит, когда вы комментируете другую функцию get_sizes ?

1
dasJulian 2 Сен 2020 в 13:24

2 ответа

Лучший ответ

Чтение файлов - это последовательный процесс. Когда вы открываете файл, создается внутренний «указатель», запоминающий, где вы находитесь в файле - сначала он указывает на начало файла, и каждый раз, когда вы читаете его фрагмент, «указатель» перемещается мимо этого фрагмента. и указывает на первый байт, который еще не был прочитан. Итак, после того, как одна из ваших функций считывает файл, этот указатель устанавливается на его конец, а когда вторая функция пытается его прочитать, он кажется пустым. Вам необходимо сбрасывать этот указатель между чтениями, вызывая file_opener.seek(0).

Кстати. file_opener - это немного сбивающее с толку имя - эта переменная содержит сам файловый объект, а не какой-то объект, предлагающий функциональные возможности для открытия файла.

1
tyrrr 2 Сен 2020 в 10:33

Вы можете прочитать файл-объект только один раз. Я должен сохранить данные файла в переменной: data = file_opener.read() и перебрать ее, иначе вам нужно вернуть указатель файла в конце функции.

Попробуй это:

get_sizes(file_opener)
file_opener.seek(0)
get_email_answers(file_opener)

Чтобы уточнить: проблема не в функциях, а в том, как вы обрабатываете входной файл.

0
Exelian 2 Сен 2020 в 10:30