2017-08-22 57 views
0

我正在使用python 3.6編寫代碼,並且無法在短文本文檔中編寫我的代碼匹配字符串。這是確切的邏輯的一個簡單的例子,是打破我的更大的計劃:檢查字符串是否在文本文件中不起作用

PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt" 

file = open(PATH, 'r') 

words = ['bah', 'dah', 'gah', "fah", 'mah'] 

print(file.read().splitlines()) 

if 'bah' not in file.read().splitlines(): 
    print("fail") 

與格式化,像這樣的文本文檔:

bah 
gah 
fah 
dah 
mah 

,它的確是打印出每一個我跑這一次失敗。我是否使用不正確的方法從文本文檔中讀取數據?

+2

你已經'讀'文件,所以當你第二次閱讀時,沒有內容可供閱讀。擺脫你的'print'語句,或使用'file.seek(0)'。 –

+2

您在關閉文件之前多次閱讀文件。在你的'print'語句後面加上'file.seek(0)',或者把內容存入一個變量 – Wondercricket

+0

試試這個'if'bah'不在列表中(file.readlines())' –

回答

1

的問題是,你要打印print(file.read().splitlines())

所以它耗盡了文件,並file.read().splitlines()下次調用返回一個空列表...

的更好方式的「grep」你的模式將是在文件行上迭代而不是完全讀取它。所以,如果你在文件中早期發現字符串,節省您的時間:

with open(PATH, 'r') as f: 
    for line in f: 
     if line.rstrip()=="bah": 
      break 
    else: 
     # else is reached when no break is called from the for loop: fail 
     print("fail") 

小漁獲這裏是不是忘記調用line.rstrip()因爲文件發生器發出與行終止行。此外,如果在你的文件中的尾隨空格,該代碼將仍然匹配字(使它strip(),如果你想匹配,即使領先空格)如果你想匹配了很多的話

,考慮創建線的set

lines = {line.rstrip() for line in f} 

所以你in lines通話將快很多。

0

您無法讀取文件兩次。

當你做print(file.read().splitlines())時,文件被讀取,下一次調用這個函數將不會返回任何內容,因爲你已經在文件的末尾了。

1

試試:

PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt" 
file = open(PATH, 'r') 
words = file.read().splitlines() 
print(words) 
if 'bah' not in words: 
    print("fail") 
0
PATH = "your_file" 

file = open(PATH, 'r') 

words = ['bah', 'dah', 'gah', "fah", 'mah'] 

if 'bah' not in (file.read().splitlines()) : 
    print("fail") 

,你可以看到輸出沒有「失敗」,你必須使用一個代碼或將其保存在另一個變量「file.read()splitlines()。」否則你有一個'失敗'的信息

相關問題