2017-12-31 34 views
-4

Ich habe vorhandene Daten in einer Datei, die wie folgt aussieht:ein Dokument für Zahlen Suchen und Drucken der Zeile oberhalb

d893ecee58ee4d6f1ca56a358d2e6287 
69 
ae0d10efd7663c734b9ea66cec5aaa44 
100 
c9136ba49f4b1a8e89d6ed35cac95f7c 
100 
67c1431d8a06d7b2e31g86874b757eeb 
0 
8478b9587875f65d5afe54f541bada61 
11 

Was i ist das Dokument für jede Zeile mit einem Zahlenwert suchen, um tun mag größer als 30 und drucken Sie die Zeile über dieser Nummer.

Hier ist, was ich habe jetzt:

with open ('somefile.txt','r') as f, open('newfile.txt','w') as fnew: 
     for i, line in enumerate(f): 
      if line.startswith('1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9' or '10' or '11' or '12' or '13' or '14' or '15' or '16' or '17' or '18' or '19' or '20' or '21' or '22' or '23' or '24' or '25' or '26' or '27' or '28' or '29' or '30'): 
       fnew.write(line -1) 

Ich weiß, das ist nicht das sauberste Skript, aber ich möchte nur etwas, das funktioniert.

+0

Es gibt bessere Möglichkeiten, dies zu tun, aber für den Anfang, was res Ult bekommst du? – Ben

+0

Führen Sie in Ihrem Python-Interpreter: "1" oder "2". Bekommst du, was du erwartet hast? Außerdem macht "Zeile -1" keinen Sinn _bei allen _, da sie eine Ganzzahl von einer Zeichenkette subtrahiert. Noch schlimmer, "fnew.print" existiert nicht. – ForceBru

+0

Der Code/Pseudocode, der hier gezeigt wird, tut '<= 30' anstatt '> 30'. –

Antwort

1

Dies ist der Ansatz, den ich nehmen würde, die Ihre Eingangsdaten regulär übernimmt:

with open('data.txt') as f: 
    while True: 
     try: 
      data = next(f).strip() 
      number = next(f).strip() 
     except StopIteration: 
      # EOF 
      break 
     number = int(number) 
     if number > 30: 
      # TODO: Write data to other file 
      print(data) 
+1

ordentlicher - aber Sie haben die Chance verpasst, itertools zu verbreiten;) –

+1

Danke für die Hilfe. Das war genau das, was ich brauchte. – zombienumber7

0

Sie können eine Kombination von List Comprehensions und iertools.compress verwenden, um dies zu lösen.

Ihr Dateiformat muss genau dem folgen, was Sie hier gepostet haben.

import itertools 
# zero-line is the ID, 1st line is the number. NO empty lines in between. 

text = '''d893ecee58ee4d6f1ca56a358d2e6287 
69 
ae0d10efd7663c734b9ea66cec5aaa44 
100 
c9136ba49f4b1a8e89d6ed35cac95f7c 
100 
67c1431d8a06d7b2e31g86874b757eeb 
0 
8478b9587875f65d5afe54f541bada61 
11 
''' 

lines = text.split("\n") # list of all lines - you can get that from 
         # file with readlines() 

data = lines[0::2]  # your data is in every 2nd line starting at 0 

         # your numbers are in every 2nd line starting on 1 
nums = [1 if (int(x) > 30) else 0 for x in lines[1::2] ] 

# the list comprehension creates a list of 0 and 1 - 1 if number > 30 
# itertools.compress does the lifing for you 

result = itertools.compress(data,nums) 

print(list(result)) 

https://docs.python.org/3/library/itertools.html#itertools.compress

Kompresse nutzt 2 Listen und gibt einen Iterator über liste1, die nur Elemente enthält, die eine True in der anderen Liste haben.

Ohne itertools:

result2 = [] 
for idx in range(len(lines)): 
    try: 
     if idx%2 == 1 and int(lines[idx])>30: 
      result2.append(lines[idx-1]) 
    except: 
     print("Error at line: ",idx, " unable to convert to int for input'", lines[idx],"'") 


print(result2) 
+1

Dies scheint eine saubere, aber übermäßig komplexe Art, das Problem zu lösen. –

+1

@Blurp Danke, immer noch lernen Python hier :) –

0

Es gibt ein paar Probleme mit Ihrem Ansatz. Hier ist mein Versuch:

def line_gt_30(line): 
    try: 
     return int(line.strip()) > 30 
    except ValueError: 
     return False 

prev_line = None 
with open ('somefile.txt','r') as f, open('newfile.txt','w') as fnew: 
    for line in f: 
     if line_gt_30(line) and prev_line is not None: 
      fnew.write(prev_line) 
     prev_line = line 

Ich habe es nicht wirklich getestet, aber es sollte funktionieren. Es ist ähnlich wie Ihres, aber es behebt viele Ihrer Probleme.

Zuerst müssen Sie hier nicht aufzählen. Ich bin mir nicht sicher, was genau Sie mit print (Zeile -1) gemacht haben, aber Sie müssen die vorherige Zeile in einer temporären Variable behalten, da unsere Datei jetzt iterierbar ist, was bedeutet, dass Sie die Indizierung nicht verwenden können, um Zeilen wie in zu greifen eine Liste.

Auch in Startswith ('1' oder '2' oder '3' oder '4' oder ...) ist gleichbedeutend mit startswith ('1'). Du solltest genau nachlesen was oder was macht.

0

Sie können dies versuchen:

data = [i.strip('\n') for i in open('filename.txt')] 
final_data = [data[i-1] for i in range(len(data)) if all(b.isdigit() for b in data[i]) and int(data[i]) > 30] 

Ausgang:

['d893ecee58ee4d6f1ca56a358d2e6287', 'ae0d10efd7663c734b9ea66cec5aaa44', 'c9136ba49f4b1a8e89d6ed35cac95f7c'] 
1

Wenn Sie anderen Ansatz wollen, dann sammeln Daten und Werte in einem dict und dann über dict laufen, wenn Schlüssel groß ist als 30 fetch dann den Wert:

values={} 
with open('test.txt','r') as f: 
    sub = [] 
    for line in f: 

     sub.append(line.strip()) 
     if len(sub) == 2: 
      if int(sub[1]) not in values: 
       values[int(sub[1])]=[sub[0]] 
      else: 
       values[int(sub[1])].append(sub[0]) 

      sub=[] 




for key,value in values.items(): 
    if key>30: 
     print(key,value) 

output:

100 ['ae0d10efd7663c734b9ea66cec5aaa44', 'c9136ba49f4b1a8e89d6ed35cac95f7c'] 
69 ['d893ecee58ee4d6f1ca56a358d2e6287'] 

Schritt für Schritt:

zunächst alle Werte sammeln und num in dict:

values={} 
with open('test.txt','r') as f: 
    sub = [] 
    for line in f: 

     sub.append(line.strip()) 
     if len(sub) == 2: 
      if int(sub[1]) not in values: 
       values[int(sub[1])]=[sub[0]] 
      else: 
       values[int(sub[1])].append(sub[0]) 

      sub=[] 

wird es geben:

{0: ['67c1431d8a06d7b2e31g86874b757eeb'], 11: ['8478b9587875f65d5afe54f541bada61'], 100: ['ae0d10efd7663c734b9ea66cec5aaa44', 'c9136ba49f4b1a8e89d6ed35cac95f7c'], 69: ['d893ecee58ee4d6f1ca56a358d2e6287']} 

jetzt über diesen dict laufen und holen Wert dass Schlüssel wenn Schlüssel> 30

Verwandte Themen