Seite 1 von 1

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

Verfasst: Dienstag 4. März 2014, 22:48
von MoritzMoritz
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

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

Verfasst: Dienstag 4. März 2014, 22:57
von Leonidas
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))

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

Verfasst: Dienstag 4. März 2014, 22:59
von diesch
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.

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

Verfasst: Dienstag 4. März 2014, 23:30
von MoritzMoritz
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

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

Verfasst: Dienstag 4. März 2014, 23:35
von cofi
Statt `b` kannst du auch einfach `i + 1` benutzen, um die Dateinamen zu generieren.

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

Verfasst: Dienstag 4. März 2014, 23:35
von MoritzMoritz
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 ?

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

Verfasst: Dienstag 4. März 2014, 23:40
von MoritzMoritz
Danke jedenfalls. Das war gerade ein sehr erfreulicher Start mit Python

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

Verfasst: Mittwoch 5. März 2014, 00:11
von cofi
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.

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

Verfasst: Mittwoch 5. März 2014, 00:20
von Sirius3
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.

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

Verfasst: Mittwoch 5. März 2014, 09:24
von snafu
@Sirius3: Nur dass der Aufruf von `xrange()` hier wohl etwas schwierig wird, da offenbar Python 3 verwendet wird... ;)

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

Verfasst: Mittwoch 5. März 2014, 09:33
von 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.