【问题标题】:Reading Files: One single function works, but both don't读取文件:一个功能有效,但两者都无效
【发布时间】:2020-12-21 12:09:44
【问题描述】:

这是我的代码:

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 注释掉,那么 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 注释掉时,为什么会这样?

【问题讨论】:

标签: python function file for-loop


【解决方案1】:

读取文件是一个顺序过程。当您打开一个文件时,会创建一个内部“指针”,记住您在文件中的位置 - 起初它指向文件的开头,每次您读取其中的一个块时,“指针”都会移过这个块并指向尚未读取的第一个字节。所以,在你的一个函数读取文件之后,这个指针被设置到它的末尾,当第二个函数试图读取它时,它似乎是空的。您需要在读数之间重置此指针,调用file_opener.seek(0)

顺便说一句。 file_opener 是一个有点令人困惑的名称 - 这个变量保存文件对象本身,而不是某些提供打开文件功能的对象。

【讨论】:

    【解决方案2】:

    您只能读取一次文件对象。我必须将文件数据存储在一个变量中:data = file_opener.read() 并对其进行迭代,否则您需要在函数末尾返回文件指针。

    试试这个:

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

    澄清一下:问题不在于函数,而在于您处理输入文件的方式。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多