2016-04-14 24 views
1
ben gibi görünen bir metin dosyası üzerinden ayrıştırmak gerekiyor

metin dosyası üzerinden ayrıştırmak piton kullanma:sınırlayıcı

"id"$"date"$"text" 

    10001$2016-01-11$"[start] 
    this is some text 
    [stop] 
    " 
    10002$2014-03-12$"[start] 
    this is some more text 
    [stop] 
    " 
bir kütüphaneye Python ile

ve bu üç farklı unsurları vardır (id, tarih ve metin) anahtarlar olarak.

Bu öğeleri ayırmak için ayırıcıyı nasıl kullanacağımı ve listedeki tüm öğeler için bu ilk satırı nasıl kullanacağımı bilmiyorum.

bu işi gibi bir şey bile sadece yazdırmak için Could:

infile = open('filename.txt', 'r') 
for line in infile: 
    if "????" in line: 
     print(line, next(infile)) 

Ben denerseniz:

infile = open('filename.txt', 'r') 
    for line in infile: 
    if '"text"' in line: 
      print(next(infile)) 

sadece ilk satırı yazdırır. Dosyayı ayrıştırmak için Python en yerleşik csv kütüphanesini kullanabilirsiniz

[{'id':'10001', 'date':'2016-01-11', 'text':'this is some text'},{'id':'10002', 'date':'2014-03-12', 'text':'this is some more text'}] 
+2

ne tür? Bize kullandığınız kodu gösterin. –

+0

Dosyayı kendiniz yüklerseniz en iyisi olurdum. –

+0

Bir Python 'listesi'," anahtar "olarak adlandırılmamış. Python tipi olarak sonuç veri yapısının istenen formatı nedir? – Kupiakos

cevap

0
import csv 
with open(path,'rb') as f: 
    reader = csv.reader(f,delimiter='$') 
    res = [ {'id':line[0],'date':line[1],'text':line[2]} for line in reader ] 
    res = res[1:] 
+0

'res [0]' geliyor '{' date ':' date ',' text ':' text ',' id ':' id '} 'ile geri döndükten sonra her şey çalışıyor. – nquestion

+0

@nquestion, ilk elemanı kaldırabilirsiniz – galaxyan

+0

@nquestion – galaxyan

0

: gibi

Bu ideal olmazdı.

import csv 


class Parser(object): 
    START_TEXT = "[start]" 
    END_TEXT = "[stop]" 

    def __init__(self, filename): 
     self.filename = filename 


    def parse_file(self): 
     elements = [] 

     with open(self.filename, 'r') as f: 
      reader = csv.reader(f, delimiter='$') 
      first_row = next(reader) 

      key0 = first_row[0] 
      key1 = first_row[1] 
      key2 = first_row[2] 

      for row in reader: 
       elements.append({ 
        key0: row[0], 
        key1: row[1], 
        key2: self.parse_text(row[2]), 
       }) 

     return elements 

    @classmethod 
    def parse_text(cls, text): 
     start_idx = text.index(cls.START_TEXT) 
     end_idx = text.index(cls.END_TEXT) 

     new_txt = text[start_idx + len(cls.START_TEXT):][:end_idx - len(cls.END_TEXT) - 1] 

     return new_txt.lstrip('\n').rstrip('\n') 


p = Parser("infile.txt") 
elements = p.parse_file() 

print elements 

Çıkışlar: sorun

[{'date': '2016-01-11', 'text': 'this is some text', 'id': '10001'}, {'date': '2014-03-12', 'text': 'this is some more text', 'id': '10002'}] 
0
import csv 

with open('f.txt') as fp: 
    reader = csv.DictReader(fp, delimiter="$") 
    data = list(reader) 

for row in data: 
    row.update({ 
     k:v.replace('[start]','').replace('[stop]','').replace('\n','') 
     for k,v in row.items()}) 

print data 
İlgili konular