2017-08-03 4 views
0

ich eine txt-Datei, die lautet:(mehrere Zeilen)

interface 0/1 
no data 
no data 
no data 
no data 
no data 
interface 0/2 
no data 
etc... 

Ich möchte es haben Ausgabe in eine CSV mit einem Format von:

interface 0/1 | no data | no data | no data | no data | no data 
interface 0/2 | no data | no data | no data | no data | no data 

Ich habe versucht, mit dem CSV-Modul und Zeile ohne gute Ergebnisse zu schreiben. Jede Hilfe wäre willkommen.

+1

Können Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) bereitstellen und beschreiben, was Sie bisher versucht haben? – Constructor

+0

Sind Sie sicher, dass Sie dieses Format für die Ausgabe haben wollen, weil es nicht Standard ist, dass es mehrzeilige Trennzeichen wie ''| "zwischen Werten? – martineau

Antwort

0

Ich habe versucht, das csv-Modul und ohne gute Ergebnisse Zeile schreiben. Jede Hilfe wäre willkommen.

Sie sind auf dem richtigen Weg. Sie benötigen csv.writerow(s), aber die wichtige Sache ist, wie Sie Ihre Daten an sie weitergeben.

Schritt 1

Schleife durch Ihre Datei und Aggregat Reihen:

rows = [] 
for line in open('file.txt'): 
    if 'interface' in line: 
     rows.append([]) 
    rows[-1].append(line) 

Schritt 2

schreiben Reihen

import csv 
with open('file.csv', 'w') as f: # you need `wb` on python2 
    writer = csv.writer(f, delimiter='|') 
    f.writerows(rows) 
+1

In Python 3 müssen Sie anstelle von "wb" Folgendes verwenden: 'open ('file.csv', 'w', newline = '')'. – martineau

+0

Außerdem muss der 'Begrenzer' für einen' csv.writer' ein einzelnes Zeichen sein (gemäß der Dokumentation). – martineau

+0

@martineau Okay, behoben. Ty. –

0

Sieht aus in CSV

import csv 
from itertools import islice 

with open('input.txt') as fin, open('output.csv', 'w') as fout: 
    pipe_out = csv.writer(fout, delimiter='|') 
    rows = iter(lambda: list(islice(fin, 6)), []) 
    pipe_out.writerows(rows) 
0

Hier ist eine einfache, leicht unterschiedliche Antwort, die 2.7 nur Python verwendet (kein csv)

f=open("data.txt", 'r') # original data 
f1=open("output_data.txt", 'w') # this is to write the output 
newline="" 
for line in f: 
    if "interface" not in line: 
     newline=newline + r" | " + line.strip() 
    else: 
     # print newline # check this 
     f1.write(newline + '\n') 
     newline=line.strip() 
# print newline # just a visual check 
f1.write(newline) 
0

Sie auch folgende Möglichkeiten: diejenigen, zB wie Sie 6 Zeilen in eine Reihe gruppieren möchten und schreiben versuch ohne das csv-modul:

f = open("file.txt", "r") 
of = open("file.csv", "w") 

data = f.readlines() 
checkpoint = "" 

for line in data: 
    line = line.strip("\n") 
    if "interface" in line: 
     of.write(checkpoint + line) 
     checkpoint = "\n" 
    else: 
     of.write(" | " + line) 

f.close() 
of.close() 
0

CSV-Modul ist in der Regel nicht erforderlich. Dieses Skript wird gut funktionieren.

f1 = open('file1.txt', 'r') 
f2 = open('file2.csv', 'w+') 

lines = f1.read() 
for line in lines.split('\n'): 
    if line == "": 
     continue 
    elif line.startswith("interface"): 
     f2.write("\n"+line+",") 
    else: 
     f2.write(line+",") 
0

Ich habe es so gemacht:

content = '' 
with open('text_file.txt', 'r') as txt_file: 
    content = txt_file.read() 

blocks = content.split('interface') 

csv_content = '' 
for block in blocks: 
    if block != '': 
    csv_content += 'interface %s\n' % ' | '.join(block.splitlines()) 

with open('csv_file.csv', 'w') as csv_file: 
    csv_file.write(csv_content) 
0

Es durch das Sammeln einer Reihe von Daten aus jeder Zeile in der Datei sein kann und es als csv-Zeile ausgegeben wird, wenn eine Linie mit 'interface' Start ist begegnet:

import csv 

input_filename = 'interface.txt' 
output_filename = 'interface.csv' 

with open(input_filename) as infile, \ 
    open(output_filename, 'w', newline='') as outfile: 

    writer = csv.writer(outfile, delimiter='|') 
    row = [] 

    for line in (line.rstrip() for line in infile): 
     if not line.startswith('interface'): 
      row.append(line) 
     else: # new group 
      if row: 
       writer.writerow(row) # output last group 
      row = [line] 

    writer.writerow(row) # output last row 

Inhalt interface.csv Datei danach:

interface 0/1|no data|no data|no data|no data|no data 
interface 0/2|no data|no data|no data|no data|no data