2015-02-11 2 views
0

Мне нужно обработать большой текстовый файл, содержащий информацию о научных публикациях, экспортированных со страницы поиска ScienceDirect. Я хочу хранить данные в массиве массивов, так что каждая бумага представляет собой массив, и все документы хранятся в большем массиве.Python: прочитать текстовый файл в массиве - неравномерное распределение строк

Хорошая часть состоит в том, что каждая строка соответствует значению, которое я хочу поместить в массив, и что между документами существует пустая строка. Проблема заключается в том, что каждая бумага имеет различное число линий, связанных с ним, в пределах от 2 до 6. Пример данных будет:

[Authors, title, journal, date] 
[(digital object identifier)] 
[(link to ScienceDirect website)] 
[Abstract: Abstract] 
[It has been shown ...] 

[Authors, title, journal, date] 
[(digital object identifier)] 
[(link to ScienceDirect website)] 
[Abstract: Abstract] 
[It has been shown ...] 
[Keywords] 

[Authors, title, journal, date] 
[(digital object identifier)] 

и так далее. Желательной структурой данных будет ArrayAllPapers [Paper-1, Paper-2, ..., Paper-n], где каждая бумага представляет собой массив Paper-1 [авторская строка, doi-line и т. Д.]

Я могу прочитать файл в python по строкам в виде массива, но затем столкнулся с проблемой разрезания списка на основе элемента списка (в данном случае «\ n»). Я нашел решения этой проблемы для наборов данных с равным интервалом между строками для объектов, большинство из которых написано для списков, но ни одно из них не работает для неравного распределения. Возможно, мне нужно сначала записать в текстовый файл, чтобы заполнить «отсутствующие» строки, чтобы создать равный дистрибутив?

Я все еще учусь работать с Python (некоторый опыт работы с MatLab), поэтому, пожалуйста, извините меня, если есть очевидное решение для этого. Я попытался найти решение, но придумал пустой.

Любая помощь была бы высоко оценена!

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

import re, numpy 
with open("test-abstracts-short.txt", "r") as text: 
    array = [] 
    for line in text: 
     array.append(line) 
+0

Вы можете показать нам, что вы пробовали/код? – Railslide

+0

конечно! поскольку я застрял в начале, пытаясь найти правильный подход, я думал, что код может не много добавить, но вот бит кода, который я использую, чтобы поместить строки в массив: import re, numpy 'with open ("test-abstracts-short.txt", "r") в виде текста: array = [] для строки в тексте: array.append (строка) ' Я импортирую регулярные выражения, потому что я пытался сделать что-то с этим, но не удалось. Кроме того, я счастлив сделать больше исследований и обучения самостоятельно, если только кто-то может указать мне в правильном направлении. –

+0

Кроме того, как вы можете видеть из моего профиля, это мой первый вопрос на форуме, пожалуйста, извините за любые ошибки форматирования/этикета, которые я могу сделать (возможно, как код публикации в комментарии? Он, кажется, не форматирует правильно в строки, возможно, я должен добавить его на главный пост?) –

ответ

1

Поскольку вы хотите пропустить пустые строки, проще всего проверить, нет ли строки.

x = [] 
with open('my_file.txt', 'r') as f: 
    temp_list = [] 
    for line in f: 
     if line.strip(): #line is not blank 
      temp_list.append(line) 
     else: #line is blank, i.e., it contains only newlines and/or whitespace 
      if temp_list: #check if temp_list contains any items 
       x.append(temp_list) 
      temp_list = [] 
+1

Фантастический, это решает! Красиво читать кусок кода и вдруг увидеть решение проблемы, которую вы не могли видеть сами. Это имеет смысл. Большое спасибо!! –

+1

Как и прежде, я бы поднял голову, но у меня пока нет необходимой репутации ... –

0

Если первые строки являются обязательными, вы можете попытаться разобрать их и для каждой статьи создать структуру, как этот {'author': 'Name', 'digital_object_identifier': 'Value'} и скоро.

Чем вы можете попытаться разобрать наиболее распространенные ключевые слова и добавить их в виде полей. Так что ваша статья woild будет такой: {'author': 'Name', 'digital_object_identifier': 'Value', 'keyword1': 'Value', 'keyword2': 'Value', 'keyword3': 'Value'}.

Чем вы можете добавить все unparsed ключевые слова в определенном поле (для того, чтобы не потерять данные): {'author': 'Name', 'digital_object_identifier': 'Value', 'keyword1': 'Value', 'keyword2': 'Value', 'keyword3': 'Value', 'other_keys': {'key': 'value'}}.

Иными словами, вы можете разделить свой документ на обязательные и необязательные поля.

+0

Спасибо за ваш ответ! Чтобы понять, правильно ли я это понимаю, вы хотите создать массив из каждой первой строки статьи, а затем создать поля для каждого возможного типа данных для статьи и затем заполнить эти поля на основе ключевых слов. Я думаю, что этот подход столкнется с тем, что поля не помечены (в данных они просто строки без очевидных разделителей). На самом деле это не проблема для меня, это нормально, если строка, содержащая авторов, заголовок и т. Д., Представляет собой одну строку как значение внутри массива, проблема в том, как создавать отдельные записи для каждой статьи. –

+0

Чтобы уточнить, каждая строка может быть помещена в одно значение массива «как есть», но я хотел бы, чтобы все строки между абзацами (или «\ n \ n») были частью одного массива. Кроме того, я хотел бы поблагодарить вас, но у меня еще нет необходимого уровня :-) –

Смежные вопросы