#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-ю строку, чтобы этот текст с разделителями табуляции стал «квадратом»?
Что я пробовал
-
Пытался использовать замену notepad .
Найдите what:(пустой), замените на: t, установите флажок «Сопоставлять только целые слова».
Это не сработало.
Найдите, что:(пустое), замените на: t, регулярное выражение
Это не сработало.
-
Пробовал 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 должен помочь:
- вставьте содержимое файла txt на рабочий лист
- используйте data -> text для clumn
- извлеките «квадратный» диапазон -> 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 . По этой причине я также считаю, что его / ее решение должно масштабироваться лучше.