Python:阅读模式。加载到列表(使用 for 循环)并在单独的代码块中使用 read() 方法

Python: read mode. Loading into lists (with a for loop) and using the read() method in a seperate code block

我正在测试此代码的多个场景,想了解 Python 出现这种情况的原因。 两种场景都是相同的代码,只是代码块的顺序相反

#Peach is written in this .txt file
inputFile = open("C:\...\filename.txt", 'r')

场景 1:此代码正确打印列表,但最后打印 False,即使“Peach”在 .txt 文件中

#Loading into lists
myList = []

#For each line in the file
for line in inputFile:  
    #Add the line to myList, stripping out whitespace
    myList.append(line.strip()) 

print(myList)


if "Peach" in inputFile.read():
    print("Peach in .txt file?", True)
else:
    print("Peach in .txt file?", False)


inputFile.close()

场景 2:相同的代码,不同的位置。正确打印 True 但会打印出一个空列表。

if "Peach" in inputFile.read():
    print("Peach in .txt file?", True)
else:
    print("Peach in .txt file?", False)


#Loading into lists
myList = []
#For each line in the file
for line in inputFile:  
    #Add the line to myList, stripping out whitespace
    myList.append(line.strip()) 

print(myList)


inputFile.close()

一个文件对象只能读取一次。 在读取文件的时候,Python其实是用一个指针来遍历整个文件。使用“打开”时,指针默认设置为文件开头,读取后指针位于文件末尾。因此,当您再次访问文件 时,您将得到一个空字符串。

你可以试试这个方法:

with open("","r") as f:
    data=f.read()
if data.find("Peach")>-1:
    print("Peach found in .txt file")
else:
    print("Peach not found in .txt file")

我们从 .txt 文件中读取文件和写入文本到数据中。我们在 data 中找到 "Peach"。如果找到打印找到否则打印未找到。
或者,如果您想逐行列出,则:

with open("","r") as f:
    data=f.readlines()
for dat in data:
    if dat.find("Peach")>-1:
        print("Peach found in .txt file")
        break
    else:
        print("Peach not found in .txt file")

问题是您尝试从文件中读取数据两次

第一次:"Peach" in inputFile.read()

第二次:for line in inputFile:

但是在第一次读取之后,特殊的 "pointer"(告知读取下一个数据的位置)位于文件末尾,下一次读取从文件末尾读取 - 但它什么也没读取。

您必须关闭文件并再次打开才能移动到开头。

inputFile = open(...)

# read all data from file
for line in inputFile:  
    # ... code ...

inputFile.close()

# ---

inputFile = open(...)

# read again all data from file
if "Peach" in inputFile.read():
    # ... code ...

inputFile.close()

或者您必须使用inputFile.seek(0)在下一次阅读之前移动到开头。

inputFile = open(...)

# read all data from file
for line in inputFile:  
    # ... code ...

inputFile.seek(0)  # move to the beginning of file

# read again all data from file
if "Peach" in inputFile.read():
    # ... code ...

inputFile.close()

或者你应该只读取一次数据并使用内存中的数据。

inputFile = open(...)

text = inputFile.read()

inputFile.close()

# use as list of lines 

for line in text.splitlines():  
    # ... code ...

#myList = text.splitlines()  # shorter
#myList = text.split("\n")   # shorter

# use as full text

if "Peach" in text:
    # ... code ...

inputFile.close()

Python read 函数将在读取操作后提升文件中的位置,在您的第一个代码示例中,您在 for 循环中迭代了内容,所以当您到达 if声明,读取位置已经在文件末尾,那里没有桃子!

在第二个示例中,您读取文件,将位置推进到文件末尾,因此当您遍历文件以构建列表时,read 没有任何可添加的内容。

在尝试第二个代码块之前将 inputFile.seek(0, 0) 重新定位到文件的开头!

在此处阅读有关读取行为的更多信息:https://pscustomobject.github.io/python/Python-Reset-Read-Write-Position/