2016-11-29 2 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 

Мне нужен способ, чтобы разместить 3-й и 1-й один из ID человека (который ctx.message.author.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

Что вы имеете в виду под «пост» в «Мне нужен способ, чтобы отправить ..»? Вы также говорите, что вам нужно «распечатать обе строки». Под «post» вы имеете в виду просто «печать»? Каков ваш вопрос "и вывод программы?" ссылаясь на? Знаете ли вы, каков результат работы программы? Можете ли вы опубликовать выходные данные для нас? И «напечатайте сами строки», которые являются строками? Вы хотите, чтобы вы анализировали строки в файле '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() 

обеспечивает, чтобы закрыть файл, даже если произошла ошибка

.

Если вы хотите просто итерации по всем соответствующим линиям, рассмотрите использование выражения генератора вместо понимания списка. Просто измените -й скобки [] к ():

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) 
Смежные вопросы