Python Python & PHP - UnicodeEncodeError: 'ascii' codec can't encode character

Samsa

Commander
Registriert
Dez. 2005
Beiträge
2.614
Hallo zusammen,
nach ewigem gegoogle wende ich mich an Euch, in der Hoffnung, dass mir jemand helfen kann
Folgendes Problem:
Ich habe ein Python-Script, in dem eine .csv Datei eingelsen, der Inhalt durcheinandergewürfelt und danach ausgegeben wird.
(Das funktioniert auch. Lasse ich das Script laufen, ist die Ausgabe in der Shell so, wie sie sein sollte.)
Über PHP möchte ich das Script ausführen und anschließend das Ergebnis der Shell ausgeben lassen. Das funktioniert mehr oder weniger. Kommt ein Umlaut vor, schmiert die Ausgabe ab. Mit dem Fehler:
Code:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 21: ordinal not in range(128)
Das ausführen der PHP-Datei in der Shell funktioniert ohne Probleme.
Es scheint etwas mit dem String zu tun zu haben, der ein Problem mit der Übergabe von UTF-8 hat. (Oder so ähnlich?!)
Mit einer "Magic-Line" im Python-Script hat es nicht funktioniert.
Eventuell weiß einer von Euch ja weiter.

Hier ist das kleine Python-Script:
Code:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv, random, cgitb, sys;
#cgitb.enable()

with open('/home/pi/Liste/liste.csv', encoding= "UTF-8", newline="\n") as csvfile:
    csvliste = csv.reader(csvfile, delimiter=';')

    spalteeins = []
    spaltezwei = []

    for row in csvliste:
        if row[0] != "":
            spalteeins.append(row[0])

        if row[1] != "":
            spaltezwei.append(row[1])

random.shuffle(spalteeins)
random.shuffle(spaltezwei)

#print("Content-Type: text/plain;charset=utf-8\n")
for i in range(24):
    print ("%s und %s" % (spalteeeins[i], spaltezwei[i]))

Hier der Inhalt der PHP
PHP:
<?php
$command = escapeshellcmd('/home/pi/liste/script.py');
$output = shell_exec($command);
echo "<pre>$output</pre>";
?>
Das ganze läuft momentan auf einem Raspberry Pi 2 (Raspbian Jessie) mit Apache und PHP. Der Code läuft nur mit Python3.

Vielen Dank für's drübergucken
Jan
 
Zuletzt bearbeitet:
Mal ganz blöd gefragt, ohne das Problem zu adressieren -> warum zwei Scriptsprachen?

Eine csv bekommst du in Php genauso eingelesen, und ein array_shuffle oder was auch immer du da mit Python treibst wird Php wohl auch noch hinbekommen. Umgekehrt wird Python wohl auch in der Lage sein das mit pre Tags auszugeben, also warum bringst du da die zusätzliche Komplexität rein?

Wenn du genau schreibst was du da mit dem Pythonscript bezweckst kann ich dir das gerne auch fix auf Php umschreiben, mehr als 10 Zeilen Code werden das kaum werden wenn ich mir das Python so anschaue...

Ansonsten:http://stackoverflow.com/questions/3224268/python-unicode-encode-error

Schon probiert die csv mit dem Code aus der ersten Antwort zu behandeln?
 
Zuletzt bearbeitet von einem Moderator:
Hi,
Warum zwei Scriptsprachen - Nun, das Pythonscript war/ist fast fertig, die überlegung es überall zugänglich zu haben war dann der Grund für php. Also im Prinzip faulheit. ;)

Das Script macht nicht viel. Es liest die .csv Datei ein (Zwei Spalten, x Zeilen) und nimmt sich zwei zufällige Einträge raus.
Einen aus Spalte 1, einen aus Spalte 2. Dabei sollte pro Aufruf kein Eintrag doppelt ausgegeben werden.
Die Ausgabe ist eine Liste die dann zwei Einträge ausgibt. "In XY und in YZ."
Auf das PHP-Angebot, komme ich gerne zurück!
Danke!

/Edit: Ja, viele der Antworten die bei stackoverflow zu dem Thema zu finden sind, habe ich ausprobiert...
 
Zuletzt bearbeitet:
Wie gesagt, die Ausgabe funktioniert in der Shell ohne Probleme. Sowohl wenn ich das Pythonscript ausführe, als auch beim Ausführen der PHP Datei in der Shell. Der Fehler taucht im Apache-Errorlog auf.

/Edit:
Ich habe die Lösung! Der "Fehler" lag nicht bei Python, sondern in der PHP Datei.
PHP:
$locale='de_DE.UTF-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);
Das an den Anfang und die Ausgabe ist richtig.
 
Zuletzt bearbeitet:
Ka was du da treibst, aber unicode encode error ist nach kurzem Googlen eine Python Fehlermeldung. Hat mit Php nix zu tun.
 
Wie gesagt, nach dem einfügen des Codes funktioniert es nun. Das nächste Problem lies dann aber auch nicht lange warten... Der Webhoster lässt das Pythonscript nicht zu. Also stehe ich im Prinzip wieder bei null.
 
Ja, wieder bei meinem Vorschlag Numero Uno: PHP für alles nutzen :D

Wenn du magst poste mal eine Beispielcsv, dann bau ich dir schnell das PHP dazu. Ohne mag ich nicht wirklich damit anfangen, "csv" ist ein weites Feld was die Definition angeht....
 
Hi!
Der Inhalt der .csv sieht so aus
Code:
In OrtA1 hier und da;in OrtB1 hier und da
In OrtA2 hier und da;in OrtB2 hier und da
In OrtA3 hier und da;in OrtB3 hier und da
In OrtA4 hier und da;in OrtB4 hier und da
usw.
Der Trenner ist das ";"

Danke Dir!
 
PHP:
<?php
$file = './liste.csv';
if (($handle = fopen($file, "r")) !== FALSE) {
  $spalte1= array();
  $spalte2 = array();
  while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
    if(is_array($data)) {
      if($data[0] != '') {
        $spalte1[] = $data[0];
      }
      if($data[1] != '') {
        $spalte2[] = $data[1];
      } 
    }
  }
  shuffle($spalte1);
  shuffle($spalte2);
  $cnt = count($spalte1);
  if(count($spalte2) < $cnt) {
    $cnt = count($spalte2);
  }
  if($cnt > 24) {
    $cnt = 24;
  }
  
  for($i=0; $i<$cnt; $i++) {
    echo $spalte1[$i].' und '.$spalte2[$i].'<br />';
  }
  fclose($handle);
}

Pfad musste noch anpassen ;)

Gerade gesehen das soll für die Shell sein, dann wäre es -> echo $spalte1[$i].' und '.$spalte2[$i]."\n"; Mit <br /> kommt man da nicht weit zwecks Zeilenumbruch :D
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben