Я новичок в python, и сейчас у меня нет идей. Что я пытаюсь: я получил файл
пример:
254 578 name1 *--21->28--* secname1
854 548 name2 *--21->28--* secname2
944 785 name3 *--21->28--* secname3
1025 654 name4 *--21->28--* secname4
между этими файлами много пробелов, и я не хочу удалять определенные пробелы между "name *" и "secname *" для каждой строки. Я не знаю, что делать, как показано в примере, удалите символ/пробелы 21 → 28
Что я получил до сих пор:
fobj_in = open("85488_66325_R85V54.txt")
fobj_out = open("85488_66325_R85V54.txt","w")
for line in fobj_in:
fobj_in.close()
fobj_out.close()
В конце он должен выглядеть так:
254 578 name1 secname1
854 548 name2 secname2
944 785 name3 secname3
1025 654 name4 secname4
Чтобы удалить символы по определенным позициям индекса, вы должны использовать нарезку
for line in open('85488_66325_R85V54.txt'):
newline = line[:21] + line[29:]
print(newline)
удаляет символы в столбце 21:28 (это все пробелы в вашем примере)
fobj_in = open("file.txt") fobj_out = open("file.txt","w") for line in fobj_in: newline = line[:213] + line[243:] fobj_out.write(newline) fobj_in.close() fobj_out.close()
open("file.txt","w")
если вы используете open("file.txt","w")
. Используйте open("file.txt","a")
Просто разделите строку и нажмите элемент, который вам не нужен.
fobj_in = open('85488_66325_R85V54','r')
fobj_out = open('85488_66325_R85V54.txt', 'a')
for line in fobj_in:
items = line.split()
items.pop(3)
fobj_out.write(' '.join(items)+'\n')
fobj_in.close()
fobj_out.close()
Если имена имеют разную длину и вы не хотите просто удалить заданное количество пробелов между ними, вы можете искать пустые символы, чтобы найти, где начинается sname
и name
заканчивается:
# open file in "read" mode
fobj_in = open("85488_66325_R85V54.txt", "r")
# use readlines to create a list, each member containing a line of 85488_66325_R85V54.txt
lines = fobj_in.readlines()
# For each line search from the end backwards for the first " " char
# when this char is found create first_name which is a list containing the
# elements of line from here onwards and a second list which is the elements up to
# this point. Then search for a non " " char and remove the blank spaces.
# remaining_line and first_name can then be concatenated back together using
# + with the desired number of spaces between then (in this case 12).
for line_number, line in enumerate(lines):
first_name_found = False
new_line_created = False
for i in range(len(line)):
if(line[-i] is " " and first_name_found is False):
first_name = line[-i+1:]
remaining_line = line[:-i+1]
first_name_found = True
for j in range(len(remaining_line)):
if(remaining_line[-j-1] is not " " and new_line_created == False):
new_line = remaining_line[0:-j]+ " "*12 + first_name
new_line_created = True
lines[line_number] = new_line
то просто напишите lines
до 85488_66325_R85V54.txt
.
Вы можете просто использовать метод split
на строковый объект, например:
f = open('my_file.txt', 'r')
data = f.readlines()
final_data = []
for line in data:
bits = line.split()
final_data.append([bits[0], bits[1], bits[2], bits[4]])
В основном я просто иллюстрирую, как использовать этот метод split
чтобы разбить каждую строку на отдельные фрагменты, после чего вы можете делать все, что хотите, например, печатать все эти биты и выборочно отбрасывать один из столбцов.
Я могу предложить надежный метод для коррекции входной строки.
#!/usr/bin/env ipython
# -----------------------------------
line='254 578 name1 *--21->28--* secname1';
# -----------------------------------
def correctline(line,marker='*'):
status=0;
lineout='';
for val in line:
if val=='*':
status=abs(status-1);continue
if status==0:
lineout=lineout+val;
elif status == 1:
lineout=lineout
# -----------------------------------
while lineout.__contains__(' '):
lineout=lineout.replace(' ',' ');
return lineout
# ------------------------------------
print correctline(line)
В принципе, он перемещается по элементам входного файла. Когда он находит какой-то маркер, из которого следует пропускать текст, он пропускает его и, наконец, просто заменяет слишком много пробелов одним пробелом.
Вы можете попытаться сделать это следующим образом:
for line in fobj_in: setstring = line print(setstring.replace(" ", "")
fobj_out
?