"TypeError: Can' T convert 'int' object to str implizit" Versuchen, umbenennen von Dateien in Python ist3
Schrieb ich die folgende Funktion zum umbenennen einer Reihe von JPGs. Sie kommen aus der scanner wie eine fortlaufende Nummer, aber ich muss wissen, was die Vorder-und Rückseite jedes Dokument ist (in JPG-form). Wie ich wählte, um dies zu tun ist, machen Sie ein Ende in Einem, und das eine Ende in B. Zum Beispiel:
- 00001.jpg wird 00001B.jpg
- 00002.jpg wird 00001A.jpg
- 00003.jpg wird 00002B.jpg
- 00004.jpg wird 00002A.jpg
Dies ist, weil der scanner hat ein eigenartiges Verhalten, bei dem die Rückseite gescannt wird, bevor die vor jedem Dokument.
Schrieb ich die folgende Funktion, um diese zu bewältigen:
def make_page_denotation(rename_directory, extension, rename_files):
for filename in glob(rename_files):
sequential_number = int(filename[-9:-4])
if sequential_number & 1 == True:
os.rename(filename, filename.replace(str(sequential_number), str(sequential_number) + "B"))
if sequential_number & 1 == False:
os.rename(filename, filename.replace(int(sequential_number), int(sequential_number) - 1))
os.rename(filename, filename.replace(str(sequential_number), str(sequential_number) + "A"))
Aber, ich erhalte die folgende Fehlermeldung:
> Traceback (most recent call last):
File "imageqa.py", line 311, in <module>
imageqa_misc.make_page_denotation(rename_directory, extension, rename_files)
File "/home/mylan/workspace/Working/Image-QA/imageqa_misc.py", line 68, in make_page_denotation
os.rename(filename, filename.replace(int(sequential_number), int(sequential_number) - 1))
TypeError: Can't convert 'int' object to str implicitly
Ich kann nicht herausfinden, für das Leben von mir, warum dies geschieht. Ich bin noch neu in Python und die Programmierung im Allgemeinen, und Schreibe eine Reihe von Skripten, um mir zu helfen im täglichen Leben "einzutauchen" so dass jede Hilfe wäre sehr geschätzt werden! Die ungeraden test (Erster block) funktioniert perfekt, auf seine eigene, so dass ich nicht sicher bin, wie ich es vermasselte den zweiten block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
0) nicht vergleichen, um boolean-Literale. Verwenden Sie einfach die Bedingung direkt.
1) nicht schreiben "wenn <irgendwas>" und dann "wenn <nicht etwas, was>". Das ist es, was
else
ist für.2)
% 2
ist ein klarer parity-test als& 1
.3) Deine Logik ist falsch: Sie subtrahieren Sie 1 von der geraden zahlen und verlassen die ungeraden zahlen unangetastet, so dass Sie bekommen würde 1, 1, 3, 3, 5, 5... statt 1, 1, 2, 2, 3, 3 wie gewünscht ein. Sie benötigen eine division durch 2 in es. Die einfache Möglichkeit ist das hinzufügen von 1, Division durch 2 (in integer-Arithmetik, dieser verwirft den Rest), und dann fügen Sie entweder ein 'A' oder 'B' gemäß der Parität.
4) Die Fehlermeldung sagt dir genau, was falsch ist.
TypeError: Can't convert 'int' object to str implicitly
bedeutet genau das, was es sagt.replace
ersetzt einige Teilstring in einem string durch einen anderen string. Sie können nicht ersetzen einen int in einen string mit einem anderen int-Datentyp, da die Zeichenfolge nicht enthalten int-Werte (es enthält lediglich Teilzeichenketten werden können interpretiert als ints), und nicht speichern keine ints, dass Sie versuchen, in Sie gesteckt.Selbst wenn Sie könnten dies tun, gäbe es keine Möglichkeit für die implizite Konvertierung zu wissen, wie viele führende Nullen zu verwenden, in den Ersatz.
Den Umgang mit diesem ist die Konvertierung explizit, natürlich. Das ist es, was
int
in Ihrem code: explizit konvertieren den string in eine Ganzzahl. Die Aufrufestr
im code nutzlos sind, weil die explizite Konvertierung einer Zeichenfolge in einen string funktioniert nichts.Also die Logik ist:
a) Extrahieren der Teil, den wir gehen, zu ersetzen, und explizit konvertieren nach int.
b) Mathematik um den ganzzahligen Teil von dem Austausch.
c) die Verwendung von string-Formatierung zu erstellen, die eine Zeichenfolge, die enthält (a) ein null-string-Repräsentation des neuen integer; (b) entweder " A "oder" B " als suffix.
d) Ersetzen Sie den Teil, den wir gehen, zu ersetzen, dass der Ersatz. Statt der Suche nach dem text noch einmal und ersetzen Sie es, wir werden einfach zu Spleißen der Ersatz, wo das original war - das ist mehr direkte und vermeidet Fehler (z.B. wenn der name der Datei geschieht, enthalten eine Kopie der Zahl früher auf).
In
filename.replace(int(sequential_number), int(sequential_number) - 1)
, die beiden Argumentestr.replace
müssen strings sein, Sie sind vorbei, in ganzen zahlen, die die traceback-sagt Sie. Versuchenfilename.replace(int(sequential_number), str(int(sequential_number) - 1))
..Auch, was Sie versuchen zu tun, mit
sequential_number & 1
? Prüfen, ob die Zahl gerade ist? Warum nicht einfachsequential_number % 2 == 0
? Das ist klarer zu Lesen.Selbst wenn deine Frage gelöst ist, nun, ich habe eine reommendation:
ist ziemlich hässlich. Besser tun: