2011-01-08 7 views
0

Ich schreibe ein einfaches Programm in Python 2.7 mit PycURL-Bibliothek, um Dateiinhalte an Pastebin zu senden. Hier ist der Code des Programms:Neue Frage zur Dateiformatierung in Python

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

Der Ausgang Pastebin sieht aus wie Standard-Python-Liste: ['string\n', 'line of text\n', ...] usw.

Gibt es eine Möglichkeit, es zu formatieren könnte, damit es besser aussieht und es ist eigentlich für Menschen lesbaren? Außerdem wäre ich sehr froh, wenn mir jemand sagen könnte, wie man mehrere Dateneingaben in POSTFIELDS verwendet. Pastebin API verwendet paste_code als seine Hauptdateneingabe, aber es kann optionale Dinge wie paste_name verwenden, die den Name des Uploads festlegen, oder paste_private, der es privat setzt.

+0

Ich empfehle die 'POSTFIELDS' Frage als separate Frage zu stellen. – marcog

Antwort

1
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 

beim Lesen von Dateien, verwenden Sie die with Anweisung (dies stellt sicher, dass die Dateien richtig geschlossen werden, wenn etwas schief geht).

Es ist nicht notwendig, eine main Funktion zu haben und sie dann aufzurufen. Verwenden Sie das Konstrukt if __name__ == "__main__", damit Ihr Skript beim Aufruf automatisch ausgeführt wird (es sei denn, Sie importieren es als Modul).

Zum Buchen mehrerer Werte können Sie die URL manuell erstellen: Trennen Sie einfach verschiedene Schlüssel, Wertpaare mit einem kaufmännischen Und-Zeichen (&). So: key1=value1&key2=value2. Oder Sie können eine mit urllib.urlencode (wie andere vorgeschlagen) bauen.

BEARBEITEN: mit urllib.urlencode auf Strings, die gepostet werden, stellt sicher, dass der Inhalt richtig codiert ist, wenn die Quellzeichenfolge einige lustige/reservierte/ungewöhnliche Zeichen enthält.

+1

Denken Sie daran, urlencode 'file_contents' und' name'. –

+0

@Emilio Silva: gute Bemerkung, aktualisierte meine Antwort ein wenig – ChristopheD

0

Verwendung .Read() statt .readlines()

+0

Bitte geben Sie mehr eine Erklärung, was tut man als die andere nicht, warum ist eine weitere hilfreich für die Frage. – helion3

3

Erstens verwenden .read() als virhilo gesagt.

Der andere Schritt ist urllib.urlencode() zu verwenden, um einen String zu erhalten:

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

Dies wird auch Ihnen erlauben, mehr Felder zu schreiben:

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

Die POSTFIELDS sollte die gleiche Art und Weise, wie Sie sended sende Query String Argumente. Also, in erster Linie ist es notwendig, encode die Zeichenfolge, die Sie an paste_code senden, und dann mit & können Sie weitere POST-Argumente hinzufügen.

Beispiel:

paste_code=hello%20world&paste_name=test 

Viel Glück!