18 Stimmen

Wie kann man mehrere Dateien lesen und schreiben?

Ich möchte ein Programm für diese Aufgabe schreiben: In einem Ordner habe ich n Anzahl von Dateien; zuerst eine Datei lesen und eine Operation durchführen, dann das Ergebnis in einer separaten Datei speichern. Dann lesen Sie die 2. Datei, führen die Operation erneut durch und speichern das Ergebnis in der neuen 2. Führen Sie das gleiche Verfahren für n Anzahl der Dateien. Das Programm liest alle Dateien nacheinander ein und speichert die Ergebnisse jeder Datei separat. Bitte geben Sie Beispiele, wie ich das machen kann.

1 Stimmen

Wahrscheinlich. Aber gleichzeitig lerne ich gerade selbst Python, und es scheint mir eine gute Übung zu sein, mich daran zu erinnern, dass ich nicht mit dem Kopf gegen die Wand schlage. Wenn es ihm nicht wichtig genug ist, dieses Wissen selbst zu erlernen, wer bin ich dann, dass ich ihm widerspreche? Wenn man eine Prüfung nicht besteht, ist man am Ende trotzdem durchgefallen.

2 Stimmen

Ich habe es als Hausaufgabe gekennzeichnet; das Stellen und Beantworten von Hausaufgabenfragen steht auf der Website auf dem Plan, aber im Interesse der Fragesteller möchte ich, dass wir sie zuerst bitten, einen Code zu liefern, der bisher nicht funktioniert.

18voto

Mapad Punkte 8044

Was Sie vermissen, ist, wie Sie alle Dateien in diesem Verzeichnis abrufen können. Verwenden Sie dazu das glob-Modul. Hier ist ein Beispiel, das alle Dateien mit der Erweiterung *.txt in Dateien mit der Erweiterung *.out dupliziert

import glob

list_of_files = glob.glob('./*.txt')           # create the list of file
for file_name in list_of_files:
  FI = open(file_name, 'r')
  FO = open(file_name.replace('txt', 'out'), 'w') 
  for line in FI:
    FO.write(line)

  FI.close()
  FO.close()

0 Stimmen

Ein kleines Problem mit diesem Beispiel. Was passiert, wenn ich eine Datei namens "mytxtfile.txt" habe?

13voto

Matthew Scharley Punkte 121038
import sys

# argv is your commandline arguments, argv[0] is your program name, so skip it
for n in sys.argv[1:]:
    print(n) #print out the filename we are currently processing
    input = open(n, "r")
    output = open(n + ".out", "w")
    # do some processing
    input.close()
    output.close()

Dann nennen Sie es so:

./foo.py bar.txt baz.txt

0 Stimmen

Print(n), um es python 3 kompatibel zu machen. Funktioniert immer noch mit 2.4 mindestens, als gut.

0 Stimmen

Für ein einzelnes Argument mag es übertrieben sein, aber ich empfehle das optparse-Modul für das Parsen von Befehlszeilen. Es kümmert sich um unangenehme Aufgaben wie die Behandlung von Anführungszeichen usw.

9voto

Alex Coventry Punkte 64405

Vielleicht finden Sie die fileinput Modul nützlich. Es ist genau für dieses Problem konzipiert.

2voto

monkut Punkte 39059

Ich habe vor kurzem den Befehl os.walk() kennengelernt, der Ihnen vielleicht weiterhilft. Er ermöglicht es Ihnen, eine Verzeichnisbaumstruktur abzulaufen.

import os
OUTPUT_DIR = 'C:\\RESULTS'
for path, dirs, files in os.walk('.'):
    for file in files:
        read_f = open(os.join(path,file),'r')
        write_f = open(os.path.join(OUTPUT_DIR,file))

        # Do stuff

1voto

michaeljoseph Punkte 6773

Kombinierte Antwort, die ein Verzeichnis oder eine bestimmte Liste von Dateinamen als Argumente enthält:

import sys
import os.path
import glob

def processFile(filename):
    fileHandle = open(filename, "r")
    for line in fileHandle:
        # do some processing
        pass
    fileHandle.close()

def outputResults(filename):
    output_filemask = "out"
    fileHandle = open("%s.%s" % (filename, output_filemask), "w")
    # do some processing
    fileHandle.write('processed\n')
    fileHandle.close()

def processFiles(args):
    input_filemask = "log"
    directory = args[1]
    if os.path.isdir(directory):
        print "processing a directory"
        list_of_files = glob.glob('%s/*.%s' % (directory, input_filemask))
    else:
        print "processing a list of files"
        list_of_files = sys.argv[1:]

    for file_name in list_of_files:
        print file_name
        processFile(file_name)
        outputResults(file_name)

if __name__ == '__main__':
    if (len(sys.argv) > 1):
        processFiles(sys.argv)
    else:
        print 'usage message'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X