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.
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?
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
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!