print('File%d') % i zusammen mit fopen

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
MoritzMoritz
User
Beiträge: 10
Registriert: Dienstag 4. März 2014, 22:32

Hallo an alle,

ich steige gerade von Matlab auf Python um (nicht aus Kostengünden) und schreibe ein simples Skript um csv Dateien in einem Verzeichniss auszulesen.

Ich möchte nicht die Variante

Code: Alles auswählen

 FileToOpen = glob.glob('somedir/*.csv') 
verwenden, da meine Dateien durchnummeriert sind und mir folgende Variante einfacher erscheint:

Code: Alles auswählen

 while i in NumberOfRuns:
  FileToOpen = print('Run%d.csv') %i
  with open(FileToOpen) as f:
    f_csv=csv.reader(f)
    headers = next(f_csv)
    for row in f_csv
     #do something with row 
allerdings bekomme ich einen Syntax fehler in der Zeile mit print. Print alleine funktioniert. Wie übergebe ich den Dateinamen als Argument an open() ?

LG

Moritz
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Der %-Operator arbeitet auf String-Objekten, nicht auf dem Rückgabewert von ``print()``, daher:

Code: Alles auswählen

print('Run%d.csv' % i)
Oder

Code: Alles auswählen

print('Run{}.csv'.format(i))
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

print ist ein Ausdruck (Python2) bzw. eine Funktion (python3), mi5t der du etwas ausgeben kannst. Du kannst damit keine Stribngs formatieren o.ä. Lass dass print einfach weg:

Code: Alles auswählen

FileToOpen = 'Run%d.csv' %i

Deine Benennung der Variablen entspricht nicht den unter Python üblichen Konventionen. Schau dir mal PEP 8 -- Style Guide for Python Code an, bevor du dir da einen schlechten Stil angewöhnst.
http://www.florian-diesch.de
MoritzMoritz
User
Beiträge: 10
Registriert: Dienstag 4. März 2014, 22:32

Ok danke für die raschen! Antworten.

Das mit PEP 8 schaue ich mir an

Hier das vollständige Beispiel für alle Nachkommenden (achtung Anfänger am Werk):

Code: Alles auswählen

number_of_runs = range(number_of_files)
b=0

for i in number_of_runs
  b+=1 # actually my files start with 1 and not 0
  file_to_open = 'Run%d.csv' %b
  with open(file_to_open) as f:
    f_csv=csv.reader(f)
    # headers = next(f_csv) # i don not have headers
    for row in f_csv:
      print(row) # or some other stuff
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Statt `b` kannst du auch einfach `i + 1` benutzen, um die Dateinamen zu generieren.
MoritzMoritz
User
Beiträge: 10
Registriert: Dienstag 4. März 2014, 22:32

Der %-Operator arbeitet auf String-Objekten, nicht auf dem Rückgabewert von ``print()``, daher:
Code:

Code: Alles auswählen

 print('Run%d.csv' % i) 
Was mir nicht ganz klar ist:

Code: Alles auswählen

 print('Run%d.csv') %20 
ergibt : Run20.csv

Code: Alles auswählen

 print('Run%d.csv' %20) 
ergibt : Run20.csv

ist da ein Unterschied ?
MoritzMoritz
User
Beiträge: 10
Registriert: Dienstag 4. März 2014, 22:32

Danke jedenfalls. Das war gerade ein sehr erfreulicher Start mit Python
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

In Python2 laeuft beides auf dasselbe hinaus, weil die Klammern ueberfluessig sind und keine Bedeutung haben. Sprich da steht nach dem Compiler tatsaechlich dasselbe.

In Python3 gibt die `print` Funktion (hier braucht man tatsaechlich die Klammern!) `None` zurueck und darum ergaebe `print('Run%d.csv') % 20` einen Typ-Fehler.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

MoritzMoritz: wenn Du von 1 ab zählst, dann kannst Du das auch ins Range schreiben:

Code: Alles auswählen

numbers_of_runs = xrange(1, number_of_files+1)
wobei Du hier xrange nehmen solltest, da Du ja gar keine Liste brauchst.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Sirius3: Nur dass der Aufruf von `xrange()` hier wohl etwas schwierig wird, da offenbar Python 3 verwendet wird... ;)
BlackJack

@snafu: Nope, es wird Python 2 verwendet. Denn im ersten Beitrag steht, dass ``FileToOpen = print('Run%d.csv') %i`` zu einem SyntaxError führt, und das würde es in Python 3 nicht. Da würde es zur Laufzeit zu einem ``TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'`` kommen.
Antworten