2016-11-29 42 views
0
@bot.command(pass_context=True) 
async def getyourfiles(ctx): 
    """Prints all files that you uploaded""" 
    ll = open('test2.txt', 'r').read() 
    kk = str(ll) 
    aa = kk.find(ctx.message.author.id) 
    await bot.say(aa) 

的Test2包含此:如何在多個字符串中找到關鍵字,然後在Python中打印所有關鍵字?

140886965359738880 | XD3MPS.jpg 
125367412370440192 | 28saa.png 
140886965359738880 | 871AHA.jpg 
125367412370440192 | 281aha.png 

我需要一種方法來發布從一個人的ID的第3和第一個1(其中ctx.message.author.id獲取並假設ID是第一和第三)。我需要在儘可能少的代碼行中打印兩行。和程序的輸出? 2.我如何自己打印字符串?

編輯:我的意思是「發佈」是打印。我需要從Test2的打印兩行:

140886965359738880 | XD3MPS.jpg 
140886965359738880 | 871AHA.jpg 

我也想指出的是,如果我不運行這個程序(它與不同的相關殭屍不應影響如何回答這個問題),這程序會吐出2.

>>> ll = open('test2.txt', 'r').read() 
>>> kk = str(ll) 
>>> aa = kk.find('140886965359738880') 
>>> print(aa) 
... 2 

不完全是REPL,但足夠接近以理解它的要點。 這些線是什麼,我需要最終的字符串:

140886965359738880 | XD3MPS.jpg 
140886965359738880 | 871AHA.jpg 
+0

你所說的「後」,在「我需要一種方法來發布。」是什麼意思?你還說你需要「打印兩條線」。通過「發佈」,你的意思是「打印」?你的問題是什麼「和程序的輸出?」指的是?你知道這個程序的輸出是什麼嗎?你可以發佈輸出給我們看嗎?通過「打印琴絃本身」,這些琴絃?你的意思是你想解析'test2.txt'文件中的行並打印第一列數字?請編輯您的問題,並嘗試更清楚地闡明您的問題。 – davedwards

回答

0

一種可能性是使用正則表達式(import re

其他(容易)的選擇將是一個列表理解:

ll = open('test2.txt', 'r').readlines()) 
aa = [line for line in ll if line.startswith('140886965359738880')] 
print aa 

readlines給出了一個字符串列表,等於readline().split('\n')。以aa =開頭的行是列表理解。它過濾列表中符合if條件的每個元素,這裏以'140886965359738880'開頭。 print aa然後打印列表。如果你只想要字符串使用

for element in aa: 
    print element 

改爲。


還要考慮使用上下文管理器讀取該文件(或tryfinally確保關閉後的文件:

with open('test2.txt', 'r') as file_: 
    ll = file_.readlines() 

確保關閉文件,即使出現錯誤


如果您只是想遍歷所有匹配行,請考慮使用生成器表達式而不是列表理解。 S中的括號[]()

aa = (line for line in ll if line.startswith('140886965359738880')) 

這將返回一個迭代器,而不是一個列表。它可用於一次循環(for line in aa: print aa),或者您可以使用aa.next()方法獲取元素。對於非常大的列表,這可能更有效。


如何使你的代碼最終會看起來像:

@bot.command(pass_context=True) 
async def getyourfiles(ctx): 
    """Prints all files that you uploaded""" 
    with open('test2.txt', 'r') as file_: 
     ll = file_.readlines() 
    aa = [line for line in ll if ll.startswith(ctx.message.author.id)] 
    for line in aa: 
     await bot.say(line) 
相關問題