Как удалить разрывы строк или объединить строки в текстовом файле с помощью python?

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть текстовый файл, который содержит «блоки последовательных строк», каждый блок представляет одно наблюдение, тогда как разные строки внутри каждого блока представляют значение одной переменной соответствующего наблюдения. Я добился этого, используя python, и я хотел бы прочитать текстовый файл в Stata. Поэтому я хотел бы удалить разрывы строк внутри каждого блока, чтобы получить одну строку, содержащую всю информацию для одного блока / наблюдения (разделенную запятыми). Однако разрывы строк между блоками / наблюдениями должны сохраняться.

Порядок информации о переменных одинаков для всех блоков / наблюдений, но количество переменных в каждом наблюдении варьируется (в нижнем конце). мой файл .txt (encoding = ‘ascii’) выглядит следующим образом:

obs1_var1,

obs1_var2,

obs1_var3,

obs2_var1,

obs2_var2,

obs2_var3,

obs2_var4,

obs3_var1,

obs3_var2,

obs3_var3,

Комментарии:

1. Неясно, что такое входные данные и каков желаемый результат.

2. with open(file) as f:..lines = f.read().strip().split() ?

3. Пожалуйста, поделитесь скриншотом примерного входного файла, а также кодом, которым вы пытались этого добиться.

4. Ниже я добавил скриншот, показывающий, как список выглядит на данный момент. Я также попытался описать, куда я хотел бы перейти оттуда. Спасибо за вашу помощь

Ответ №1:

Попробуйте

 with open('my_file.txt','r') as f:
    # lines should hold the data with no new lines
    lines = [l.strip() for l in f.readlines()]
  

Ответ №2:

вы можете расширить ответ Балдермана:

 with open('filename.txt','r') as f:
    lines = [l.strip() for l in f.readlines()]
  

Эта часть создаст список строк всего файла. Чтобы создать единую строку для переменных в каждом блоке, вы можете просто использовать dictionary для хранения переменных в каждом блоке.
Пример:

 block_vars = {}
for line in lines:
    block_name = line[:4]
    if block_name not in block_vars.keys():
        block_vars[block_name] = []        #declaring as list store the lines in that block
    block_vars[block_name].append(line)    #append the line to list with same block name 
  

словарь block_vars содержит список строк, связанных с определенным блоком. Вы можете использовать ‘delimiter’.join(list_name) для получения однострочного вывода.

Комментарии:

1. with open('WS16_17/Bachelor-Studiengänge - Hauptfach_sorted.txt','r', encoding='utf-8', errors='replace') as f: # lines should hold the data with no new lines lines = [l.strip() for l in f.readlines()] f.close()

2. Этот код (благодаря @balderman) создает список с именем lines, который выглядит следующим образом: [ i.imgur.com/Au41MY3.png ] Последовательные строки относятся к одному и тому же наблюдению (название лекции, титры, тип, семестр, лектор и т.д.). Отсюда мне нужно каким-то образом перенести это в dataset, предпочтительно в Stata. Обратите внимание, что порядок «переменных» (заголовок, титры, тип и т.д.) Всегда одинаков, Но не каждый блок / наблюдение (разделенные пустыми элементами списка) имеют одинаковую длину. Вот почему я не уверен, работает ли словарь, поскольку для этого требуется определить, сколько строк составляет один блок?

3. Кристиан, я понял твою точку зрения. Я вижу, что ваш файл не соответствует структуре. Я также видел, что каждый блок начинается с ключевого слова «VName». Если этот шаблон соблюдается во всем файле, вы можете просто разделить каждый блок таким образом.