2016-12-12 6 views
1
34512340 plain brackets  0.50 30 
56756777 100mm bolts   0.20 0 
90673412 L-shaped brackets 1.20 30 

ich diese Textdatei habe, und ich möchte am Ende jeder Zeile den Wert zu nehmen, etwas zu tun, um es und es dann ohne Rückschreib Wechsel die Formatierung des Textes. Im Grunde ändern Sie einfach den letzten Wert jeder Zeile.Amend Wert am Ende einer Zeile auf einem Textdatei - Python

Mein aktueller Ansatz besteht darin, die Zeile in eine Liste von Werten unter Verwendung der Abstände/Tabs aufzuteilen, aber ich weiß nicht, wie ich die Leerzeichen/Tabs wieder einfügen kann, wie zuvor.

Irgendwelche Vorschläge?

hier ist auch meine Mock-up-Code ..

import re 
import fileinput 
with open('stock.txt', 'r') as stock: 
    stockList = stock.readlines() 

print(stockList[0]) 
print(re.split(r'\t+', stockList[0].rstrip('\t').rstrip('\n'))) 
with fileinput.FileInput('test.txt', inplace=True) as file: 
    for line in file: 
     print(line.replace(stockList[0], ammendedLineWithEditedValue), end='') 
+0

, das ist keine schlechte Idee, aber man konnte verwenden, um den 'csv' Modul als auch. – zmo

+0

Ich wollte CSV vermeiden, weil das Layout und der Code des Textes von diesem Layout abhängen. Aber danke :) –

+0

Gibt es immer 1 + Tabs + Ziffern am Ende der Zeile? Grundsätzlich können Sie dafür eine Regex verwenden, wenn Sie sicher sind, dass die Daten unter einem bestimmten Muster liegen. –

Antwort

0

Sie haben nicht wirklich reguläre Ausdrücke dafür brauchen. Die Standard-String-Methoden können Sie split eine Zeichenfolge an einem bestimmten Zeichen, und dann join die Zeichenfolge wieder zurück.

with open('stock.txt', 'r') as stock, \ 
    open('test.txt', 'w') as test: 
    for line in stock: 
    tokens = line.split('\t') 

    # Edit last token in line 
    tokens[-1] = str(int(tokens[-1]) + 5) 

    result = '\t'.join(tokens) 
    test.write(result + '\n') 
+0

Danke, das funktioniert perfekt :) –

0

können Sie einen regulären Ausdruck verwenden 1+ Tabs passen und dann 1+ Ziffern am Ende der Leitung mit

r'(\t+)([0-9]+)$ 

Hier ist ein regex demo.

Siehe ein Python demo, die - für die Demo-Zwecke - nur 30 auf den Wert mit dem regulären Ausdruck gefunden fügen hinzu:

import re 
def ammendedLineWithEditedValue(s): # TEST 
    return int(s) + 30 

lines = '''34512340 plain brackets  0.50 30 
56756777 100mm bolts   0.20 0 
90673412 L-shaped brackets 1.20 30''' 
for line in lines.split("\n"): 
    print(re.sub(r'(\t+)([0-9]+)$', lambda m: "{}{}".format(m.group(1), ammendedLineWithEditedValue(m.group(2))), line)) 
Verwandte Themen