Замена пустой записи текстового текста с разделителями табуляции

#python #file #python-2.7 #notepad

#python #файл #python-2.7 #notepad

Вопрос:

Это текстовый текст с разделителями табуляции.

 A    B    D
C
K    s
  

Итак, в (2,2), (2,3) (3,3) запись, ДАЖЕ НЕ ВКЛАДКА.

Строка максимальной длины — 1-я строка, а 1-я строка имеет 3 столбца.

Могу ли я просто добавить 2 вкладки во 2-ю строку, 1 вкладку в 3-ю строку, чтобы этот текст с разделителями табуляции стал «квадратом»?

Что я пробовал

  1. Пытался использовать замену notepad .

    Найдите what:(пустой), замените на: t, установите флажок «Сопоставлять только целые слова».

    Это не сработало.

    Найдите, что:(пустое), замените на: t, регулярное выражение

    Это не сработало.

  2. Пробовал python

     import fileinput
    for line in fileinput.FileInput("input.txt",inplace=1):
        line = line.replace("",t)
        print line,
      

    Это не сработало для этой цели.

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

1. Я удалил тег MATLAB из вашего вопроса. Пожалуйста, избегайте использования тегов, которые неадекватно описывают вашу проблему

Ответ №1:

В Python вы можете использовать itertools.izip_longest для этого:

 >>> from itertools import izip_longest
>>> s = 'AtBtDnCnKts'
>>> data = izip_longest(*(x.split('t') for x in s.splitlines()), fillvalue='t')
>>> for line in zip(*data):
      print line
...     
('A', 'B', 'D')
('C', 't', 't')
('K', 's', 't')
  

Если вы считываете данные из файла:

 with open('input.txt') as f:
    data = izip_longest(*(line.split('t') for line in f), fillvalue='t')
    print 'n'.join(map(''.join, zip(*data))
  

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

1. Вот как я только что писал это!

2. @200OK Спасибо. Что, если ввод — текстовый текст с разделителями табуляции? Замена на s = ‘input.txt — похоже, это не работает..

3. @user3123767 Я обновил ответ, чтобы включить это.

4. @200OK Мне очень жаль, но как я могу записать результат в output.txt ? И как я могу убедиться, что он не отображает процесс в окне командной строки?

Ответ №2:

Похоже, вам придется подсчитывать вхождения табуляции в каждой строке и добавлять n вкладок.

Однако, если это одноразовая задача, MS Excel должен помочь:

  1. вставьте содержимое файла txt на рабочий лист
  2. используйте data -> text для clumn
  3. извлеките «квадратный» диапазон -> excel должен заполнить необходимые вкладки

Ответ №3:

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

 myStr = "AtBtDnCnKts"

maxLen = max([len(line.split('t')) for line in myStr.split('n')])

newstr = ''.join([line   ('t' * (maxLen - len(line.split('t'))))   'n' for line in myStr.split('n')])

>>> newstr
'AtBtDnCttnKtstn'
  

возможно, придется немного изменить в зависимости от того, как выглядит ваш ввод, как вы обрабатываете новые строки и т. Д. Но я думаю, что это основная идея. Вы находите максимальную длину строки и просматриваете и делаете все остальные строки такой длины, заполняя их табуляциями.

Ответ №4:

Если вы используете метод для нормализации содержимого файла, чтобы он превратился в файл значений, разделенных табуляцией (tsv), вы можете сделать что-то вроде этого:

 def normalise(lines, max_num_of_columns=None):
    if max_num_of_columns == None:
       max_num_of_columns = max({len(line.split('t')) for line in lines})
    for line in lines:
        content = line.split('t')
        while len(content) < max_num_of_columns:
            content.append('')
        print 't'.join(content)

lines = ['AtBtDnC','Kts']

normalise(lines)
...
A   B   D
C
K   s   
  

Если вы не знаете max_num_of_columns, вы должны сначала проверить файл (см. Первое if).

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

1. @nichele Файл не больше моей оперативной памяти. Как мне получить это max_num_of_columns?

2. Если вы не знаете этого заранее, вам придется искать его. Это простой поиск максимального: max_num_of_columns = max({len(line.split('t')) for line in lines})

3. Я только что обновил свое решение. Проверьте это. В логических шагах это очень похоже на 200 OK. Это просто более читабельно, потому что в нем не используется функция izip_longest . По этой причине я также считаю, что его / ее решение должно масштабироваться лучше.