#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». Если этот шаблон соблюдается во всем файле, вы можете просто разделить каждый блок таким образом.