2016-04-06 17 views
2

Ich habe viele Dateien, deren Namen nur Zahlen sind. (Beginnend von 1 bis zu der maximalen Anzahl) und jede dieser Dateien ähnelt einander durch ihre "Tags" (ObjectID =, X =, Y = usw.), aber die Werte nach diesen Tags sind nicht gleich überhaupt.Daten aus einer Textdatei in eine Ausgabedatei extrahieren

Ich wollte meine Arbeit erleichtern von manuell kopieren/Einfügen der Daten von einer Datei in eine andere und machte ein kleines Skript mit Python (da ich etwas darin erfahren bin).

Dies ist die vollständige Skript:

import os 

BASE_DIRECTORY = 'C:\Users\Tom\Desktop\TheServer\scriptfiles\Objects' 
output_file = open('output.txt', 'w') 
output = {} 
file_list = [] 

for (dirpath, dirnames, filenames) in os.walk(BASE_DIRECTORY): 
    for f in filenames: 
     if 'txt' in str(f): 
      e = os.path.join(str(dirpath), str(f)) 
      file_list.append(e) 

for f in file_list: 
    print f 
    txtfile = open(f, 'r') 
    output[f] = [] 
    for line in txtfile: 
     if 'ObjectID =' in line: 
      output[f].append(line) 
     elif 'X =' in line: 
      output[f].append(line) 
     elif 'Y =' in line: 
      output[f].append(line) 
tabs = [] 
for tab in output: 
    tabs.append(tab) 

tabs.sort() 
for tab in tabs: 
    for row in output[tab]: 
     output_file.write(row + '') 

nun alles funktioniert gut, sieht die Ausgabedatei wie folgt aus:

ObjectID = 1216 
X = -1480.500610 
Y = 2610.885742 
ObjectID = 970 
X = -1517.210693 
Y = 2522.842285 
ObjectID = 3802 
X = -1512.156616 
Y = 2521.116210 
etc. 

Aber ich will nicht, dass es so sein (Jeder Wert hat eine neue Zeile). Ich brauche es, dies für jede Datei zu tun:

  1. Lesen Sie die Datei.
  2. Entfernen Sie die Tags vor den Werten.
  3. Formatieren Sie eine einzelne Zeile mit diesen Werten im Ausgabeordner. (Nehmen wir an, ich möchte es so aussehen lassen: "(1216, -1480.500610,2522.842285)")
  4. Schreiben Sie diese Zeile in den Ausgabeordner.
  5. Wiederholen Sie für jede Datei.

Irgendwelche Hilfe bitte?

+0

konnten Sie einige Beispielzeilen aus einer Datei einfügen Sie lesen müssen? – Kruser

+0

Wie die Ausgabezeilen –

+0

Ich habe Code hinzugefügt, in dem Sie die Werte in einer einzigen Zeile anhängen. – Kruser

Antwort

1

Hoffe das hilft.

data = open('sam.txt', 'r').read() 

>>> print data 
ObjectID = 1216 
X = -1480.500610 
Y = 2610.885742 
ObjectID = 970 
X = -1517.210693 
Y = 2522.842285 
ObjectID = 3802 
X = -1512.156616 
Y = 2521.116210 
>>> 

Jetzt können einige String Ersatz tun :)

>>> data = data.replace('ObjectID =', '').replace('\nX = ', ',').replace('\nY = ', ',') 
>>> print data 
1216,-1480.500610,2610.885742 
970,-1517.210693,2522.842285 
3802,-1512.156616,2521.116210 
1

In der Schleife, zu verfolgen, ob Sie ‚in‘ einem Datensatz sind:

records = [] 
in_record = False 
id, x, y = 0, 0, 0 
for line in txtfile: 
    if not in_record: 
     if 'ObjectID =' in line: 
      in_record = True 
      id = line[10:] 
    elif 'X =' in line: 
     x = line[3:] 
    elif 'Y =' in line: 
     y = line[3:] 
     records.append((id, x, y)) 
     in_record = False 

Dann finden Sie eine Liste von Tupeln, die Sie mit dem csv Modul leicht schreiben kann.

+0

Jetzt schreibt es nichts in die Datei. –

+0

@ M.Rox Sie müssen die 'records' in eine Datei schreiben. –

0

Hier ist, was Sie brauchen. Ich hatte nicht genug Zeit, um den Code zum Anhängen des Ergebnisses an eine neue Datei zu schreiben. Stattdessen druckt es nur, aber Sie bekommen den Punkt.

import os.path 

path = "path" 

#getting the number of files in your folder 
num_files = len([f for f in os.listdir(path) 
       if os.path.isfile(os.path.join(path, f))]) 

#function that returns your desired output for a given file 
def file_head_ext(file_path, file_num): 
    with open(file_path + "/" + file_num) as myfile: 
     head = [next(myfile).split("=") for x in range(3)] 
     formatted_head = [elm[1].replace("\n",'').replace(" ","") for elm in head] 
    return(",".join(formatted_head)) 


for filnum in range(1,num_files): 
    print(file_head_ext(path, str(filnum))) 
0

Hier finden Sie eine Version der Schleife, die Sie den Inhalt generieren.
Ich habe es so umgeschrieben, dass die Zeileninhalte ObjectId, X und Y in derselben Zeile stehen.

Es sieht das ist, was Sie tun möchten:

for f in file_list: 
    print f 
    txtfile = open(f, 'r') 
    output[f] = [] 
    for line in txtfile: 
     myline = '' 
     if 'ObjectID =' in line: 
      pos = line.rfind("ObjectID =") + len("ObjectID =") 
      rest = line[pos:] 
      # Here you set the delimiter after the ObjectID value. Can be "," 
      numbers = rest.split(" ") 
      if len(numbers) > 0: 
       myline.append(numbers[0]) 

     elif 'X =' in line: 
      pos = line.rfind("X =") + len("X =") 
      rest = line[pos:] 
      # Here you set the delimiter after the ObjectID value. Can be "," 
      numbers = rest.split(" ") 
      if len(numbers) > 0: 
       myline.append(numbers[0]) 
     elif 'Y =' in line: 
      pos = line.rfind("Y =") + len("Y =") 
      rest = line[pos:] 
      # Here you set the delimiter after the ObjectID value. Can be "," 
      numbers = rest.split(" ") 
      if len(numbers) > 0: 
       myline.append(numbers[0]) 

     output[f].append(myline) 

Hinweis, die Sie wissen müssen, um welches Zeichen (im Code der Begrenzer) die Namen trennt Sie zu finden versuchen: ObjectID = aus die tatsächlichen Werte, die Sie von der Linie erhalten möchten.

Verwandte Themen