Seite 1 von 1

os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:21
von python95
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!

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:37
von /me
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'

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:39
von snafu
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).

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:41
von Sirius3
@python95: am einfachsten geht das per String-Formatierung:

Code: Alles auswählen

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

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:45
von 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'

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 12:53
von snafu
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'

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 14:16
von python95
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?

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 14:38
von /me
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?

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 14:39
von snafu
Wohl eher allgemeine Programmiergrundlagen bzw Defizite beim Erbringen von Transferleistungen...

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 14:56
von python95
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")

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 15:26
von Sirius3
@python95: was heißt «hat nicht funktioniert»?

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 15:47
von 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()

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 17:32
von python95
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'

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 18:35
von Sirius3
@python95: Im Verzeichnis C:\Users\ darf man ja auch im Normalfall nicht schreiben. Das ist jetzt kein Python-Problem.

Re: os.path.splitext() verständis

Verfasst: Dienstag 3. Mai 2016, 19:03
von 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.

Re: os.path.splitext() verständis

Verfasst: Mittwoch 4. Mai 2016, 06:36
von python95
alles klar, danke!