Schreiben von Zeichenfolgen in Dateien in python
Bin ich immer die folgende Fehlermeldung, wenn Sie versuchen zu schreiben, die einen string in eine Datei im pythion:
Traceback (most recent call last):
File "export_off.py", line 264, in execute
save_off(self.properties.path, context)
File "export_off.py", line 244, in save_off
primary.write(file)
File "export_off.py", line 181, in write
variable.write(file)
File "export_off.py", line 118, in write
file.write(self.value)
TypeError: must be bytes or buffer, not str
Ich grundsätzlich eine Klasse string, die einen string enthält:
class _off_str(object):
__slots__ = 'value'
def __init__(self, val=""):
self.value=val
def get_size(self):
return SZ_SHORT
def write(self,file):
file.write(self.value)
def __str__(self):
return str(self.value)
Außerdem rufe ich die Klasse wie folgt aus (wobei die variable ist ein array von _off_str Objekte:
def write(self, file):
for variable in self.variables:
variable.write(file)
Ich habe keine Ahnung, was Los ist. Ich habe gesehen, andere python-Programme schreiben-strings, Dateien, warum also nicht diese?
Danke Ihnen sehr für Ihre Hilfe.
Edit: wie Es aussieht, musste ich angeben, wie ich die Datei geöffnet, hier ist, wie:
file = open(filename, 'wb')
primary.write(file)
file.close()
Ich antwortete auf deine Frage, aber ich habe selbst einer. Warum zum Teufel Sie wollen, schreiben Sie Ihre eigenen string-Klasse in Python, während Python selbst habe einige wirklich mächtige Klassen ?
Oder, um es stärker. Bitte nicht erfinden Sie Ihre eigene string-Klasse. Diese Art der Sache macht wartbaren software.
Ich wollte nicht, es war genau so, wie die anderen Dateien in dem Paket hat. Am Ende habe ich mit Ihnen vereinbart, und dachte, es war wirklich dumm, und nur Riss es raus. Wir werden sehen, ob sich jemand beschwert.
"die anderen Dateien in dem Paket?" Du meinst, jedem anderen Modul erfunden, Ihre eigenen string-Klasse? Was arbeitest du mit?
Die export-scripts in blender. Es könnte auch einfach sein, dass ich nicht verstehen, die Ihnen aber. Ich war gerade auf der Suche an der export_3ds, wenn Sie Pflege, die viel.
Oder, um es stärker. Bitte nicht erfinden Sie Ihre eigene string-Klasse. Diese Art der Sache macht wartbaren software.
Ich wollte nicht, es war genau so, wie die anderen Dateien in dem Paket hat. Am Ende habe ich mit Ihnen vereinbart, und dachte, es war wirklich dumm, und nur Riss es raus. Wir werden sehen, ob sich jemand beschwert.
"die anderen Dateien in dem Paket?" Du meinst, jedem anderen Modul erfunden, Ihre eigenen string-Klasse? Was arbeitest du mit?
Die export-scripts in blender. Es könnte auch einfach sein, dass ich nicht verstehen, die Ihnen aber. Ich war gerade auf der Suche an der export_3ds, wenn Sie Pflege, die viel.
InformationsquelleAutor Leif Andersen | 2010-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, Sie sind mit Python 3 und geöffnet haben, wird die Datei im Binär-Modus, die akzeptieren nur bytes oder Puffer in es geschrieben.
Jede chance, die wir sehen konnten, der code öffnet die Datei zum schreiben?
edit: wie das Aussieht, ist tatsächlich der Täter.
InformationsquelleAutor Mike Boers
Welche version von Python benutzt du? In Python 3.x ein string Unicode-text enthält keine Besondere Codierung. Schreiben Sie es aus, um einen stream von bytes (ein Datei), die Sie konvertieren Sie es in ein byte-Codierung wie UTF-8, UTF-16, und so weiter. Glücklicherweise ist dies leicht getan mit der
encode()
Methode:Weiteres Beispiel, das schreiben von UTF-16-Datei:
Schließlich können Sie mit Python 3 "automagic" text-Modus, der wird automatisch konvertieren Sie Ihre
str
auf die Codierung, die Sie angeben:Dies sollte ausgewählt werden, wie die Antwort!!!
was passiert, wenn Sie öffnen Sie einfach die Datei als
f = open('output.txt', 'w')
? Was-encoding von Python 3 verwenden?Wenn Sie das tun, sind Sie immer eine
TextIOWrapper
, und Sie verwendet Ihre bevorzugte Codierung bestimmt durch Aufruflocale.getpreferredencoding(False)
, das ist wahrscheinlichUTF-8
. Ich würde immer das encoding anzugeben, oder verwenden Sie'wb'
wenn ich schreiben wolltebytes
mit keine Codierung.InformationsquelleAutor Nate
Ich bin nicht zu sehen, öffnen Sie zuerst die Datei:
Andersen: Wenn Sie keine post reicht der code für uns zu sehen, und reproduzieren Sie das problem, Sie bekommen nicht viel von einer Antwort.
sorry, ich dachte nur nicht, dass es wichtig war, und dass der Krempel in die Frage, es ist jetzt da.
Andersen: Genug code zum reproduzieren des Problems kann nicht immer aufgerufen werden, "Unordnung".
InformationsquelleAutor Manu
Sehe ich Sie in Kommentar, die Sie erwähnt, dass Sie habe
Das bedeutet, dass Sie das öffnen der Datei zum schreiben Binär (so lassen Sie einfach die
b
flag).variable.write(file)
nenntfile.write(variable)
.(sorry wegen der schwer lesbaren code, wie es aussieht, kann ich nicht gut formatieren in den Kommentaren), Indem Sie die andere Weise herum, ich bin dem Aufruf der write-Methode auf die variable[i] - Objekt. Nonsensicle, ich weiß, aber aus irgendeinem Grund, das ist der Stil, den die anderen Dateien, also sollte ich wohl dabei bleiben. Auch den code haben,, in der _str_off Klasse, die ich hatte: def write(self,file): Datei.write(self.Wert), die haben, a: Datei.write(variable)
Boers, True, meinen Beitrag aktualisiert. @Leif Andersen: meinen Beitrag aktualisiert.
Wirklich, eine frühere version der Datei (geschrieben für python 2.5), verwendet strings. Ich werde give it a shot.
InformationsquelleAutor ChristopheD
Wie hast du die Datei öffnen ?
Entsprechend der Fehlermeldung, die ich Schätze :
Wenn Sie möchten, verwenden Sie Zeichenfolgen, die Sie verwenden müssen :
Wenn Sie "b", Dateien werden erwarten, dass binäre Daten, und Sie schreiben
self.value
was ist ein string.Durch die Art und Weise, verwenden Sie nicht
file
" als variable Namen, wie es verbirgt diefile
eingebauten Python-Objekt.InformationsquelleAutor e-satis