Search code examples
pythonfilecurlpastebin

Newbie question about file formatting in Python


I'm writing a simple program in Python 2.7 using pycURL library to submit file contents to pastebin. Here's the code of the program:

#!/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()

The output pastebin looks like standard Python list: ['string\n', 'line of text\n', ...] etc.

Is there any way I could format it so it looks better and it's actually human-readable? Also, I would be very happy if someone could tell me how to use multiple data inputs in POSTFIELDS. Pastebin API uses paste_code as its main data input, but it can use optional things like paste_name that sets the name of the upload or paste_private that sets it private.


Solution

  • 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
    

    When reading files, use the with statement (this makes sure your file gets closed properly if something goes wrong).

    There's no need to be having a main function and then calling it. Use the if __name__ == "__main__" construct to have your script run automagically when called (unless when importing this as a module).

    For posting multiple values, you can manually build the url: just seperate different key, value pairs with an ampersand (&). Like this: key1=value1&key2=value2. Or you can build one with urllib.urlencode (as others suggested).

    EDIT: using urllib.urlencode on strings which are to be posted makes sure content is encoded properly when your source string contains some funny / reserved / unusual characters.