Извлечение определенных строк из файла и создание разделов данных в python

Попытка написать скрипт python для извлечения строк из файла. Файл представляет собой текстовый файл, который является дампом вывода python suds.

Я хочу:

  1. разделите все символы, кроме слов и цифр. Мне не нужны никакие символы "\ n", "[", "]", "{", "=" и т. Д.
  2. найдите раздел, где он начинается с «ArrayOf_xsd_string»
  3. удалить следующую строку "item [] =" из результата
  4. возьмите оставшиеся 6 строк и создайте словарь на основе уникального числа в пятой строке (123456, 234567, 345678), используя этот номер в качестве ключа и остальных строк в качестве значений (прошу простить мое невежество, если я не объясню это в пифоническая терминология)
  5. вывод результатов в файл

Данные в файле – это список:

[(ArrayOf_xsd_string){ item[] = "001", "ABCD", "1234", "wordy type stuff", "123456", "more stuff, etc", }, (ArrayOf_xsd_string){ item[] = "002", "ABCD", "1234", "wordy type stuff", "234567", "more stuff, etc", }, (ArrayOf_xsd_string){ item[] = "003", "ABCD", "1234", "wordy type stuff", "345678", "more stuff, etc", }] 

Я попытался сделать re.compile, и вот моя неудачная попытка кода:

 import re, string f = open('data.txt', 'rb') linelist = [] for line in f: line = re.compile('[\W_]+') line.sub('', string.printable) linelist.append(line) print linelist newlines = [] for line in linelist: mylines = line.split() if re.search(r'\w+', 'ArrayOf_xsd_string'): newlines.append([next(linelist) for _ in range(6)]) print newlines 

Я новичок Python и не нашел никаких результатов в google или в stackoverflow для того, чтобы извлечь определенное количество строк после поиска определенного текста. Любая помощь очень ценится.

Пожалуйста, игнорируйте мой код, поскольку я беру «снимки в темноте» 🙂

Вот что я хотел бы увидеть в качестве результатов:

 123456: 001,ABCD,1234,wordy type stuff,more stuff etc 234567: 002,ABCD,1234,wordy type stuff,more stuff etc 345678: 003,ABCD,1234,wordy type stuff,more stuff etc 

Надеюсь, что это поможет с попыткой интерпретировать мой ошибочный код.

3 Solutions collect form web for “Извлечение определенных строк из файла и создание разделов данных в python”

Несколько предложений по вашему коду:

Снятие всех не-буквенно-цифровых символов совершенно не нужно и требует времени; нет никакой необходимости в создании linelist . string.find("ArrayOf_xsd_string") ли вы, что вы можете просто использовать простой старый string.find("ArrayOf_xsd_string") или re.search(...) ?

  1. разделите все символы, кроме слов и цифр. Мне не нужны никакие символы "\ n", "[", "]", "{", "=" и т. Д.
  2. найдите раздел, где он начинается с «ArrayOf_xsd_string»
  3. удалить следующую строку "item [] =" из результата

Тогда, как и в вашем регулярном выражении, _ уже покрывается под \W Но следующее переназначение линии переписывает строку, которую вы только что прочитали?

 for line in f: line = re.compile('[\W_]+') # overwrites the line you just read?? line.sub('', string.printable) 

Вот моя версия, которая читает файл напрямую, а также обрабатывает несколько совпадений:

 with open('data.txt', 'r') as f: theDict = {} found = -1 for (lineno,line) in enumerate(f): if found < 0: if line.find('ArrayOf_xsd_string')>=0: found = lineno entries = [] continue # Grab following 6 lines... if 2 <= (lineno-found) <= 6+1: entry = line.strip(' ""{}[]=:,') entries.append(entry) #then create a dict with the key from line 5 if (lineno-found) == 6+1: key = entries.pop(4) theDict[key] = entries print key, ','.join(entries) # comma-separated, no quotes #break # if you want to end on first match found = -1 # to process multiple matches 

И результат – это именно то, что вы хотели (вот что ','. Join (entries) для):

 123456 001,ABCD,1234,wordy type stuff,more stuff, etc 234567 002,ABCD,1234,wordy type stuff,more stuff, etc 345678 003,ABCD,1234,wordy type stuff,more stuff, etc 

Если вы хотите извлечь определенное количество строк после соответствующей строки, которая соответствует. Вы можете просто прочитать в массиве с помощью readlines, прокрутить его, чтобы найти совпадение, а затем взять следующие N строк из массива. Кроме того, вы можете использовать цикл while вместе с readline, что предпочтительнее, если файлы могут стать большими.

Следующее – самое прямое исправление для вашего кода, о котором я могу думать, но его не обязательно наилучшая общая реализация, я предлагаю следовать моим советам выше, если у вас нет веских причин не делать или просто делать работу как можно скорее или мошенник;)

 newlines = [] for i in range(len(linelist)): mylines = linelist[i].split() if re.search(r'\w+', 'ArrayOf_xsd_string'): for l in linelist[i+2:i+20]: newlines.append(l) print newlines 

Должен делать то, что вы хотите, если я правильно истолковал ваши требования. Это говорит: возьмите следующую, но одну строку, а следующие 17 строк (так, вплоть до 20-й строки после матча), добавьте их в новые строки (вы не можете сразу добавить весь список, этот список станет единым указатель в списке, к которому вы добавляете).

Удачи и удачи 🙂

Давайте поиграем с итераторами!

 class SudsIterator(object): """extracts xsd strings from suds text file, and returns a (key, (value1, value2, ...)) tuple with key being the 5th field""" def __init__(self, filename): self.data_file = open(filename) def __enter__(self): # __enter__ and __exit__ are there to support return self # `with SudsIterator as blah` syntax def __exit__(self, exc_type, exc_val, exc_tb): self.data_file.close() def __iter__(self): return self def next(self): # in Python 3+ this should be __next__ """looks for the next 'ArrayOf_xsd_string' item and returns it as a tuple fit for stuffing into a dict""" data = self.data_file for line in data: if 'ArrayOf_xsd_string' not in line: continue ignore = next(data) val1 = next(data).strip()[1:-2] # discard beginning whitespace, val2 = next(data).strip()[1:-2] # quotes, and comma val3 = next(data).strip()[1:-2] val4 = next(data).strip()[1:-2] key = next(data).strip()[1:-2] val5 = next(data).strip()[1:-2] break else: self.data_file.close() # make sure file gets closed raise StopIteration() # and keep raising StopIteration return key, (val1, val2, val3, val4, val5) data = dict() for key, value in SudsIterator('data.txt'): data[key] = value print data 
Python - лучший язык программирования в мире.