2014-02-12 2 views
0

Мне нужно прочитать строку, хранящуюся в файле verbatim. Я пробовал писать строку между одиночными и двойными кавычками, но это, похоже, не работает.Прочтите стенографическую строку из файла

Вот MWE того, что я имею в виду:

with open('file.dat', mode="r") as f: 
    for line in f: 
     reader = line.split() 
     # Read string. 
     liter = str(reader[1]) 

print liter 

Файл file.dat состоит из одной строки, например, так:

ID " Literal\t : " 

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

Эта строка не всегда будет выглядеть точно так же. Он не может иметь, например, нет характера в начале (то есть: "Literal\t : ") пространство вместо \t символа (т.е. " Literal : ") без пробелов в начале или в конце (то есть: "Literal\t :"), и т.д ..

В результате я «м после того, как то же самое я хотел бы получить делать просто (в случае примера выше):

liter = ' Literal\t : ' 

Как я мог это сделать?

+0

Более крупный образец данных поможет. 'line.split (None, 1)' и 'ast.literal_eval (liter [1])', но обычно лучше избегать 'literal_eval', если у вас нет эксклюзивного контроля над содержимым. –

+0

Если вы пишете файл .dat, почему бы не использовать другой разделитель столбцов, например «|»? –

+0

Вы имеете в виду для '\ t' в вашей строке, чтобы стать символом табуляции, или вы имеете в виду, что он останется двумя символами, обратным слэшем и' t'? Не совсем ясно, что вы пытаетесь сделать и что вы подразумеваете под «дословным». – Blckknght

ответ

2

Ну, если ваши данные гарантированно всегда выглядят точно как это, вы могли бы просто использовать регулярные выражения:

import re 

data = ''' 
ID " Literal\t : " 
''' 

for line in data.split('\n'): 
    if line: 
     liter = re.search(r'"(.*)"', line).groups()[0] 
     print(liter) 
     print(repr(liter)) 

Результат:

Literal  : 
' Literal\t : ' 
+0

См. Обновленный вопрос @senshin, что вы подразумеваете под «если ваши данные всегда будут выглядеть так же»? – Gabriel

+0

@Gabriel. Я имею в виду, что если каждая строка ваших данных содержит идентификатор, который не содержит двойных кавычек, за которым следует ваша буквальная строка, которая окружена двойными кавычками и не сопровождается чем-либо другим, тогда это будет работать , – senshin

0

Как об использовании csv модуля к прочитайте свой файл? Он поддерживает любой символ разделителя, который вы хотите, и может поддерживать несколько способов цитирования текстов, содержащих разделитель. Похоже, вам нужен разделитель пробелов и цитаты вокруг строк, которые включают пробелы (которые являются стандартным типом цитаты):

with open('file.dat', newlines="") as f: # if you're using Python 2, open in binary mode 
    reader = csv.reader(f, delimiter=" ") 
    for line in reader: 
     print(line) # for the example data, line[1] will be " Literal\\t : " 
Смежные вопросы