2013-12-12 3 views
1

У меня есть файл, который выглядит какРазделить строку по маске в питоне

12 MG -5.000000000000E-01 -5.000000000000E-01 0.000000000000E+00 
16 S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01 
    8 O  2.189546044408E-01 -1.271822846411E-01 4.012978695812E-01 

, и я хочу, чтобы отделить цифры от передней линии, с выходом

MG -5.000000000000E-01 -5.000000000000E-01 0.000000000000E+00 
S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01 
O  2.189546044408E-01 -1.271822846411E-01 4.012978695812E-01 

У меня есть это

for line in file: 
    head, sep, tail = line.partition('wildcard') 
    print tail 

Что мне следует использовать для подстановочного знака?

+0

Это похоже на формат фиксированной ширины для меня; можете ли вы подтвердить, что 3-я строка дополняется одним дополнительным пространством по сравнению с предыдущими двумя? –

ответ

5

Вы можете использовать,

head, sep, tail = line.strip().partition(" ") 

Вся программа становится как этот

with open("Input.txt") as inFile: 
    for line in inFile: 
     print line.strip().partition(" ")[2] 

Выход

MG -5.000000000000E-01 -5.000000000000E-01 0.000000000000E+00 
S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01 
O  2.189546044408E-01 -1.271822846411E-01 4.012978695812E-01 
+0

Да, это сработало отлично! Благодаря! –

+0

@MichaelR Добро пожаловать :) – thefourtheye

6

Ваш формат выглядит как формат с фиксированной колонкой, где каждый столбец имеет фиксированную ширину.

Если да, то используйте вместо нарезка:

for line in file: 
    print line[4:] 

отрезать первые 4 символа.

В качестве альтернативы, разделение на пробельных один раз, с None аргументом str.split():

for line in file: 
    tail = line.split(None, 1)[-1] 
    print tail 

str.split(None)пропускает пробелов в начале строки и расщепляется на первую последовательность пробельных символов после первого столбца. [-1] берет последний элемент; даже если на строке есть не более одного столбца, вы получите результат.

Демо:

>>> line = ' 16 S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01\n' 
>>> line.split(None, 1) 
['16', 'S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01\n'] 
2
text = '''12 MG -5.000000000000E-01 -5.000000000000E-01 0.000000000000E+00 
16 S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01 
    8 O  2.189546044408E-01 -1.271822846411E-01 4.012978695812E-01''' 


for line in text.splitlines(): 
    print line.split(None,1)[1] 

результат

MG -5.000000000000E-01 -5.000000000000E-01 0.000000000000E+00 
S  1.558454815345E-01 1.558454815345E-01 2.500000000000E-01 
O  2.189546044408E-01 -1.271822846411E-01 4.012978695812E-01 
0

Вместо того, чтобы делать это самостоятельно, вы можете также использовать библиотеку: подпрограммы ввода/вывода Numpy в (loadtxt) очень полезны для разбора таких файлов.

В вашем случае вам необходимо указать тип данных записи (dtype, см. numpy.loadtxt).

Смежные вопросы