Ich mache einen Python-Code, um Textdateien zu bearbeiten. Der Code erhält von der Befehlszeile Eingabedatei- und Ausgabedateinamen sowie ein Flag -sort, -reverse usw. entsprechend der Manipulation, die auf die Eingabedatei angewendet werden soll, und schreibt schließlich die Daten in die Ausgabedatei. Ich muss diesen ganzen Job innerhalb einer Klasse erledigen, damit der Code vererbbar ist. Bisher habe ich einen Code wie diesen:

import argparse  
import random  

class Xiv(object):  

    def __init__(self):  
        parser = argparse.ArgumentParser()  
        group = parser.add_mutually_exclusive_group()  
        group.add_argument("-s", "-sort", action="store_true")  
        group.add_argument("-r", "-reverse", action="store_true")  
        group.add_argument("-sh", "-shuffle", action="store_true")  
        parser.add_argument("inputfile", type = file, help="Input file name")  
        parser.add_argument("outputfile", type = file, help="Output file name")  
        args = parser.parse_args()  
        source =args.inputfile  
        dist = args.outputfile  

    def sort(self):  
     f = open(source, "r")  
     list1 = [line for line in f if line.strip()]  
     f.close()  
     list.sort()  
     with open(dist, 'wb') as fl:  
       for item in list:  
        fl.write("%s" % item)  

    def reverse(self, source, dist):  
     f = open(source, "r")  
     list2 = [line for line in f if line.strip()]  
     f.close()  
     list2.reverse()  
     with open(dist, 'wb') as f2:  
       for item in list2:  
         f2.write("%s" % item)      

def shuffle(self, source, dist):  
    f = open(source, "r")  
    list3 = [line for line in f if line.strip()]  
    f.close()  
    random.shuffle(list3)  
    with open(dist, 'wb') as f3:  
     for item in list3:  
      f3.write("%s" % item)  

x = Xiv();  

Jetzt wenn ich es laufen lasse als

python xiv.py -s text.txt out.txt 

Es wird der folgende Fehler angezeigt

IOError: [Errno 2] No such file or directory 'out.txt'  

Aber 'out.txt' wird die Ausgabedatei sein. Ich schlage den Code vor, um sie zu erstellen, falls die Datei noch nicht vorhanden ist. Und es hat funktioniert, bevor ich diesen Code in die Klasse eingefügt habe ...

3
Prophet 21 Aug. 2015 im 17:58

3 Antworten

Beste Antwort

Wenn ich in Python 2 file für eine nicht vorhandene Datei aufrufe, wird folgende Fehlermeldung angezeigt:

In [13]: file('out.txt')
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-13-d0d554b7d5b3> in <module>()
----> 1 file('out.txt')

IOError: [Errno 2] No such file or directory: 'out.txt'

In Py2 entspricht file open. Es öffnet eine Datei, standardmäßig im r -Modus, und gibt diesen Fehler aus, wenn die Datei nicht vorhanden ist.

In argparse bedeutet type=foo, dass die Funktion foo unter Verwendung der Eingabezeichenfolge ausgeführt wird. Dies bedeutet nicht, dass die Zeichenfolge als Objekt dieses Typs interpretiert wird.

In Ihrem Code:

with open(dist, 'wb') as f2:  
   for item in list2:  
       f2.write("%s" % item)

Das heißt, Sie erwarten, dass dist ein Dateiname oder eine Zeichenfolge ist. Sie möchten nicht, dass der Parser die Datei zuerst öffnet. Das machst du selbst. Geben Sie also keinen type -Parameter an.

@tmoreau - Python3 hat diese file -Funktion gelöscht und nur open übrig gelassen.

1
hpaulj 21 Aug. 2015 im 17:09

Ich habe diesen Fehler bekommen ..

jemdoc index Traceback (letzter Aufruf zuletzt): Datei "/ usr / bin / jemdoc", Zeile 1563, in main () Datei "/ usr / bin / jemdoc", Zeile 1555, in main infile = open (inname, 'rUb ') IOError: [Errno 2] Keine solche Datei oder kein solches Verzeichnis:' index.jemdoc '

Dann habe ich mich verändert

infile = open(inname, 'rUb') 

Zu

infile = open(inname, 'w+')

Dann wurde der Fehler behoben.

1
SamWhan 27 Mai 2016 im 15:14

Die Funktion open öffnet standardmäßig eine Datei zum Lesen. Sie möchten es im Schreib- / Erstellungsmodus öffnen, der es erstellt, wenn es nicht vorhanden ist, und es Ihnen ermöglicht, darauf zu schreiben:

with open(dist, 'w+') as f3:

Das zweite Argument gibt den Öffnungsmodus an und ist standardmäßig 'r', dh schreibgeschützt.

Ich bin mir nicht sicher, warum es funktioniert hat, bevor Sie es in die Klasse verschoben haben - nach allem sollte es keinen Unterschied machen.

1
zrneely 21 Aug. 2015 im 17:06