2016-08-01 2 views
3

У меня есть текстовый файл, который выглядит следующим образом:В python, как сканировать текстовый файл с одной длинной строкой и разделять элементы на разные столбцы?

“Distance 1: Distance XY” 1 2 4 5 9 “Distance 2: Distance XY” 3 6 8 10 5 “Distance 3: Distance XY” 88 45 36 12 4 

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

“Distance 1: Distance XY” 1 2 4 5 9 
“Distance 2: Distance XY” 3 6 8 10 5 
“Distance 3: Distance XY” 88 45 36 12 4 

Я хочу сделать это, чтобы сделать словарь для каждого измерения расстояния.

+3

У вас есть «умные кавычки» в том, что вы скопировали и вставили, а не прямые ASCII двойных кавычек , Это также то, что находится в вашем файле, или это произошло, когда вы копировали и вставляли сюда? –

+0

Чтобы отделить одну длинную строку в список строк, сохраняя разделитель как часть строки: 's = ['" D' + e для e в text_file.split ('"D'), если e! =" "] '. Получил это из: http://stackoverflow.com/questions/3475251/split-a-string-by-a-delimiter-in-python –

+0

Это кавычки, которые появляются, когда я использую open(), чтобы открыть мой файл в python , –

ответ

5

Вы можете использовать re.split разбить строку с регулярными выражениями:

import re 
s = '\"Distance 1: Distance XY\" 1 2 4 5 9 \"Distance 2: Distance XY\" 3 6 8 10 5 \"Distance 3: Distance XY\" 88 45 36 12 4' 

re.split(r'(?<=\d)\s+(?=\")', s) 

# ['"Distance 1: Distance XY" 1 2 4 5 9', 
# '"Distance 2: Distance XY" 3 6 8 10 5', 
# '"Distance 3: Distance XY" 88 45 36 12 4'] 

(?<=\d)\s+(?=\") ограничивает разделитель пространства между цифрой и цитатой.

Если смарт котировка в текстовом файле, заменить \" со смарт-цитаты, вариант + [ на макинтош, check here for windows:

with open("test.txt", 'r') as f: 
    for line in f: 
     print(re.split(r'(?<=\d)\s+(?=“)', line.rstrip("\n"))) 

# ['“Distance 1: Distance XY” 1 2 4 5 9', '“Distance 2: Distance XY” 3 6 8 10 5', '“Distance 3: Distance XY” 88 45 36 12 4'] 

Или использовать Юникод для левых смарт кавычки \u201C:

with open("test.csv", 'r') as f: 
    for line in f: 
     print(re.split(r'(?<=\d)\s+(?=\u201C)', line.rstrip("\n"))) 

# ['“Distance 1: Distance XY” 1 2 4 5 9', '“Distance 2: Distance XY” 3 6 8 10 5', '“Distance 3: Distance XY” 88 45 36 12 4'] 
+0

Благодарим за помощь! Я должен вводить код неправильно, потому что когда я его запускаю, вывод заканчивается одним индивидуальным символом в каждой строке. Так, например: 'D' 'я' 'а' 'п' 'C' 'е' '' и т.д ... Любая идея 'S' 'T' на то, что я «Неправильно? –

+0

Вы имеете в виду, что все символы разделены как один элемент? Это странно. На самом деле, у меня нет большой идеи, она должна работать, если ваш файл фактически содержит только одну строку. Вы можете проверить все три версии, чтобы посмотреть, как это происходит. Похоже, что каждый символ является одной строкой в ​​вашем файле. – Psidom

+0

Спасибо, я буду держать его под контролем. Это было очень полезно и, безусловно, шаг в правильном направлении. –

1

Возможно, менее элегантное решение, чем Psidom, при условии, что линии имеют одинаковый формат каждый раз:

with open("input.txt", 'r') as file: 
    line = file.read() 
    line = line.split() 
    count = 0 
    output = open("output.txt", 'w') 
    for i in line: 
     output.write(i) 
     output.write(" ") 
     count+=1 
     if count == 9: 
      output.write("\n") 
      count = 0 
    output.close() 
+0

Я не думаю, что это касается озабоченности OP, которая заключается в том, что он хочет, чтобы длинная строка была разбита на подгруппы, разделенные определенной строкой. –

1

Попытка улучшить прекрасный ответ Эндрю.

with open("input.txt", 'r') as file: 
    output = open("output.txt", 'w') 
    for line in file: 
     line = line.split() 
     relevant_line = line[0:9] 
     relevant_line_as_string = " ".join(relevant_line) 
     output.write(relevant_line_as_string + '\n') 
    output.close() 

Вам не нужно закрывать, если ваш используют «с» :)

~ ❯❯❯ touch input 
~ ❯❯❯ vim input 
~ ❯❯❯ touch script.py 
~ ❯❯❯ vim script.py # script.py has my answer copy pasted there 
~ ❯❯❯ touch output 
~ ❯❯❯ python script.py 
~ ❯❯❯ cat output 
“Distance 1: Distance XY” 1 2 4 5 9 
# it works! 
+0

Спасибо за это. Я пробовал это, и все работало на python, но созданный выходной файл пуст. Любая идея, почему это может быть? –

+0

Да. Я отредактировал свой ответ. Глупый мой. Я использовал «с» с вводом, но не с выходом, поэтому мне нужно закрыть выход. Или используйте два выражения «с» :) – joaquinlpereyra

+0

Все еще пустой файл :(Я понятия не имею, что я делаю неправильно. –

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