2017-09-18 3 views
1

J'essaie d'ajouter du texte à un fichier par programmation via l'API.Python: API, le fichier édité n'est pas formaté correctement

Voici mon code:

def updateFile(fileId): 
    headers = { 
     'Content-Type': 'application/json', 
     'token': token 
    } 
    url = 'https://example.com/api/file/' + str(fileId) + '/upload' 
    te = """ 
     this 
     is 
     text 
     sdfs 
    """ 
    te= json.dumps(te) 
    return requests.put(url, headers=headers, data=te) 
r = updateFile(id) 
print r.json() 

Cela fonctionne, mais quand je télécharger le fichier, j'ai une chaîne comme ceci:

"\n  this\n  is\n  text\n  sdfs\n " 

Comme vous pouvez le voir, tout le texte est sur la même ligne (\n n'est pas interprété correctement), le " existe toujours.

Que puis-je faire de mal?

+0

Êtes-vous de visualiser le fichier sur Windows? http://www.cs.toronto.edu/~krueger/csc209h/tut/line-endings.html – vascowhite

+0

... Etes-vous sûr que le contenu du fichier doit être codé en json? –

Répondre

2

Mise à jour

Envoyer le contenu de fichier brut sans JSON coder, mais ne précisent pas Content-Type: application/json. En définissant cet en-tête, vous dites au serveur que le corps de la requête sera au format JSON, ce qui ne sera pas le cas si vous téléchargez le fichier tel quel. Le serveur attend du JSON mais n'est pas satisfait quand il ne reçoit pas de données JSON. Inversement, si vous envoyez des données JSON avec cet en-tête, le serveur accepte les données et les écrit dans le fichier sans les décoder.

Vous devrez peut-être définir le type de contenu. En supposant un fichier texte brut, vous pouvez utiliser text/plain.


Si vous jetez un oeil à la suite de json.dumps():

import json 

te = """ 
     this 
     is 
     text 
     sdfs 
    """ 
>>> json.dumps(te) 
'"\\n  this\\n  is\\n  text\\n  sdfs\\n "' 

vous verrez que les nouvelles lignes sont échappés afin qu'ils soient préservés. C'est pourquoi ils apparaissent dans votre fichier. Si vous ne les voulez pas dans votre fichier, ne traitez pas la chaîne comme des données JSON, téléchargez-la en l'état.


BTW, vous pouvez éviter les tracas de la conversion pour vous JSON si vous utilisez le paramètre json à la place du paramètre data:

# do not manually convert to JSON, use json parameter instead 
return requests.put(url, headers=headers, json=te) 
+0

L'API a besoin de JSON. – dmx

+0

@dmx: alors passez JSON comme vous le faites (ou utilisez le paramètre 'json' selon ma recommandation). En pratique, vous passeriez généralement un dictionnaire avec une clé d'identification et la valeur contenant vos données. par exemple. 'requests.put (url, en-têtes = en-têtes, json = {'content': te})' – mhawke

+0

Lorsque j'utilise json = {'content': te}, j'obtiens ce '{" content ":" \ n this \ n est \ n texte \ n yep \ n "}' – dmx