Вопрос новичка о форматировании файлов в Python - PullRequest
0 голосов
/ 08 января 2011

Я пишу простую программу на Python 2.7, использующую библиотеку pycURL для отправки содержимого файла в pastebin. Вот код программы:

#!/usr/bin/env python2

import pycurl, os

def send(file):
    print "Sending file to pastebin...."
    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, "http://pastebin.com/api_public.php")
    curl.setopt(pycurl.POST, True)
    curl.setopt(pycurl.POSTFIELDS, "paste_code=%s" % file)
    curl.setopt(pycurl.NOPROGRESS, True)
    curl.perform()

def main():
    content = raw_input("Provide the FULL path to the file: ")
    open = file(content, 'r')
    send(open.readlines())
    return 0

main()

Выходная пастбина выглядит как стандартный список Python: ['string\n', 'line of text\n', ...] и т. Д.

Можно ли как-нибудь отформатировать его, чтобы оно выглядело лучше и читалось человеком? Кроме того, я был бы очень рад, если бы кто-нибудь сказал мне, как использовать несколько входов данных в POSTFIELDS. API Pastebin использует paste_code в качестве основного ввода данных, но он может использовать необязательные вещи, такие как paste_name, который задает имя загрузки, или paste_private, который устанавливает его как частное.

Ответы [ 4 ]

3 голосов
/ 08 января 2011

Во-первых, используйте .read() как virhilo сказал.

Другой шаг - использовать urllib.urlencode(), чтобы получить строку:

curl.setopt(pycurl.POSTFIELDS, urllib.urlencode({"paste_code": file}))

Это также позволит вам разместить больше полей:

curl.setopt(pycurl.POSTFIELDS, urllib.urlencode({"paste_code": file, "paste_name": name}))
1 голос
/ 08 января 2011
import pycurl, os

def send(file_contents, name):
    print "Sending file to pastebin...."
    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, "http://pastebin.com/api_public.php")
    curl.setopt(pycurl.POST, True)
    curl.setopt(pycurl.POSTFIELDS, "paste_code=%s&paste_name=%s" \
                                   % (file_contents, name))
    curl.setopt(pycurl.NOPROGRESS, True)
    curl.perform()


if __name__ == "__main__":
    content = raw_input("Provide the FULL path to the file: ")
    with open(content, 'r') as f:
        send(f.read(), "yournamehere")
    print

При чтении файлов используйте оператор with (это гарантирует, что ваш файл закроется правильно, если что-то пойдет не так).

Нет необходимости иметь функцию main, а затемназывая этоИспользуйте конструкцию if __name__ == "__main__", чтобы ваш скрипт автоматически запускался при вызове (если только при импорте его в качестве модуля).

Для публикации нескольких значений вы можете вручную создать URL: просто разделите другой ключ, пары значений самперсанд (&).Вот так: key1=value1&key2=value2.Или вы можете создать его с помощью urllib.urlencode (как предлагали другие).

РЕДАКТИРОВАТЬ : использование urllib.urlencode для строк, которые должны быть опубликованы, обеспечивает правильное кодирование содержимого при исходной строкесодержит несколько забавных / скрытых / необычных персонажей.

0 голосов
/ 08 января 2011

POSTFIELDS следует отправлять так же, как вы отправляете аргументы строки запроса. Итак, во-первых, необходимо кодировать строку, которую вы отправляете в paste_code, а затем, используя &, вы можете добавить больше аргументов POST.

Пример:

paste_code=hello%20world&paste_name=test

Удачи!

0 голосов
/ 08 января 2011

используйте .read () вместо .readlines ()

...