os.path.splitext() verständis

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Hallo zusammen,


ich habe ein python skript geschrieben, welches eine Datei öffnet und anschließend bestimmte Zeilen dieser Datei in einer neuen Datei abspeichert.
Diese neue Datei hat den Namen der alten Datei + _12345

Code: Alles auswählen

NeueDatei = open(os.path.splitext(name)[0] + '_12345', "w")
Ist es möglich, dass die neue Datei den Namen der alten Datei zum Beispiel nur bis zum 15. Zeichen hat und dann _12345 angehängt wird?

Vielen Dank!
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

python95 hat geschrieben:Ist es möglich, dass die neue Datei den Namen der alten Datei zum Beispiel nur bis zum 15. Zeichen hat und dann _12345 angehängt wird?
Ja, das ist möglich. Du musst es nur programmieren.

Code: Alles auswählen

>>> '12345678901234567890'[:15]
'123456789012345'
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, das geht. Du kannst in Python angeben, dass mehrere Elemente aus einer Sequenz (hier: Zeichen aus einer Zeichenkette) in einem Rutsch bis maximal zu einer bestimmten Stelle angefordert werden sollen:

Code: Alles auswählen

print('aabbccdd'[:5])  # -> aabbc
print('abc'[:5])  # -> abc
Das Stichwort dazu lautet "Slicing", falls du an näheren Erklärungen interessiert bist (was ich dir auch empfehlen würde).
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@python95: am einfachsten geht das per String-Formatierung:

Code: Alles auswählen

neuer_dateiname = '%.15s_12345%s' % os.path.splitext(name)
BlackJack

Oder mit `format()`:

Code: Alles auswählen

In [7]: '{0[0]:.15s}_12345{0[1]}'.format(os.path.splitext('abc.txt'))
Out[7]: 'abc_12345.txt'

In [8]: '{0[0]:.15s}_12345{0[1]}'.format(os.path.splitext('abccdefghijklmnopqrstuvwxyz.txt'))
Out[8]: 'abccdefghijklmn_12345.txt'
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:

Code: Alles auswählen

In [8]: '{0[0]:.15s}_12345{0[1]}'.format(os.path.splitext('abccdefghijklmnopqrstuvwxyz.txt'))
Out[8]: 'abccdefghijklmn_12345.txt'
Wobei man das auch etwas kürzer haben kann:

Code: Alles auswählen

In [13]: '{:.15}_12345{}'.format(*os.path.splitext('abccdefghijklmnopqrstuvwxyz.txt'))
Out[13]: 'abccdefghijklmn_12345.txt'
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Vielen Dank für die schnelle Antworten und Ratschläge.

@Sirius3 : Wenn ich das so anwende, fehlt ja aber der open-Befehl, bzw. das write? :P

Code: Alles auswählen

def load_file(self):
        global name
        name = askopenfilename(filetypes=(("TEXT", "*.txt*"),                             
                                           ("All files", "*.*") ))
        if name:
            try:
                print("""file wird geladen: self.settings["template"].set(name)""")
                print(name)
            except:                     
                showerror("Open File", "Failed to read file\n'%s'" % name)
            return

Code: Alles auswählen

NeueDatei = '%.15s_12345%s' % os.path.splitext(name)
Fehlermeldung, da ja jetzt das "w" fehlt.
AttributeError: 'str' object has no attribute 'write'

Kann mir da evtl noch jemand auf die Sprünge helfen?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ja wenn es fehlt, dann ergänze es doch.

Wo ist denn dein konkretes Problem damit? Kann es sein, dass dir noch einige Python-Grundlagen fehlen?
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wohl eher allgemeine Programmiergrundlagen bzw Defizite beim Erbringen von Transferleistungen...
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Ich habe mehrere Möglichkeiten, wie z.B. probiert. Hat aber nicht funktioniert.

Code: Alles auswählen

NeueDatei = open('%.15s_12345%s' % os.path.splitext(name),"w")
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@python95: was heißt «hat nicht funktioniert»?
BlackJack

@python95: Also bei mir funktioniert das:

Code: Alles auswählen

In [9]: name = 'test.txt'

In [10]: new_file = open('%.15s_12345%s' % os.path.splitext(name), 'w')

In [11]: new_file
Out[11]: <open file 'test_12345.txt', mode 'w' at 0x97f7180>

In [12]: new_file.close()
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Wenn ich die Zeile so ändere:

Code: Alles auswählen

NeueDatei= open('%.15s_12345%s' % os.path.splitext(name),"w")
erhalte ich folgende Fehlermeldung.

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1482, in __call__
return self.func(*args)
File "C:\Users\XXX\Desktop\python\skript_filter.py", line 42, in Uebersetzung
NeueDatei = open('%.15s_12345%s' % os.path.splitext(name),"w")
PermissionError: [Errno 13] Permission denied: 'C:/Users/XXX_12345.inc'
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@python95: Im Verzeichnis C:\Users\ darf man ja auch im Normalfall nicht schreiben. Das ist jetzt kein Python-Problem.
BlackJack

@python95: Wir sind bis jetzt davon ausgegangen das `name` wirklich nur den Dateinamen enthält. Wenn da noch ein Pfad davor ist, musst Du natürlich aufpassen, dass Du den nicht zu den maximal 15 Zeichen dazuzählst, denn sonst schneidest Du Dir sehr wahrscheinlich nicht nur den kompletten Dateinamen, sondern auch noch einen Teil des Pfades weg. Das findet man übrigens sehr schnell heraus wenn man einfach mal mit ein paar realistischen Werten in einer Python-Shell ausprobiert was man da macht und sich die Zwischenergebnisse anschaut.
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

alles klar, danke!
Antworten