Я новичок в Python и хочу разделить то, что я прочитал из текстового файла на две конкретные части. Ниже приведен пример того, что можно прочитать в:

f = ['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]

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

words = ['Cats','like','dogs','as','much','cats.']

numbers = [1,2,3,4,5,4,3,2,6]

Я попытался использовать:

words,numbers = f.split("][")

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

Спасибо.

4
alice 6 Янв 2017 в 21:03

6 ответов

Лучший ответ

Я предполагаю, что f строка

f = "['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]" 

Тогда мы можем найти индекс ][ и добавить один, чтобы найти точку в скобках

i = f.index('][')
a, b = f[:i+1], f[i+1:]
print(a)
print(b)

Выход:

['Cats','like','dogs','as','much','cats.']
[1,2,3,4,5,4,3,2,6]
3
Patrick Haugh 6 Янв 2017 в 18:07

Если я правильно понимаю, у вас есть текстовый файл, который содержит ['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6], и вам просто нужно разбить эту строку при переходе между скобками. Вы можете сделать это с помощью метода string.index() и нарезки строк. Смотрите вывод моей консоли ниже:

>>> f = open('./catsdogs12.txt', 'r')
>>> input = f.read()[:-1]  # Read file without trailing newline (\n)
>>> input
"['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]"
>>> bracket_index = input.index('][')  # Get index of transition between brackets
>>> bracket_index
41
>>> words = input[:bracket_index + 1]  # Slice from beginning of string
>>> words
"['Cats','like','dogs','as','much','cats.']"
>>> numbers = input[bracket_index + 1:]  # Slice from middle of string
>>> numbers
'[1,2,3,4,5,4,3,2,6]'

Обратите внимание, что это оставит вам строку Python, которая выглядит визуально идентично списку (массиву). Если вам нужны данные, представленные как нативные объекты Python (то есть, чтобы вы могли использовать их как список), вам нужно использовать некоторую комбинацию string[1:-1].split(',') в обеих строках и list.map() в числах список для преобразования чисел из строк в числа.

Надеюсь это поможет!

1
David House 6 Янв 2017 в 18:27

Другая альтернатива, если вы все еще хотите использовать split()

f = "['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]"
d="]["
print f.split(d)[0]+d[0]
print d[1]+f.split(d)[1]
2
Vivek 6 Янв 2017 в 18:14

Еще одна вещь, которую вы можете сделать, это сначала заменить ][ на ]-[, а затем выполнить разделение или раздел с помощью -, но я предложу вам выполнить разделение, так как мы не хотим использовать этот разделитель.

< Сильный > SPLIT

f = "['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]" 
f = f.replace('][',']-[')
a,b = f.split('-')

Выход

>>> print(a)
['Cats','like','dogs','as','much','cats.']
>>> print(b)
[1,2,3,4,5,4,3,2,6]

< Сильный > PARTITION

f = "['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]"
f = f.replace('][',']-[')
a,b,c = f.partition('-')

Выход

>>> print(a)
['Cats','like','dogs','as','much','cats.']
>>> print(c)
[1,2,3,4,5,4,3,2,6]
1
wjandrea 30 Сен 2018 в 10:52

Если вы можете сделать так, чтобы ваш файл выглядел примерно так:

[["Cats","like","dogs","as","much","cats."],[1,2,3,4,5,4,3,2,6]]

Тогда вы можете просто использовать json-модуль Python, чтобы сделать это для вас. Обратите внимание, что формат JSON требует двойных кавычек, а не одинарных.

import json
f = '[["Cats","like","dogs","as","much","cats."],[1,2,3,4,5,4,3,2,6]]'
a, b = json.loads(f)
print(a)
print(b)

Документацию по библиотеке json можно найти здесь: https://docs.python.org/ 3 / библиотека / json.html

2
Brad Campbell 6 Янв 2017 в 18:15

Альтернатива ответу Патрика с использованием регулярных выражений:

import re

data = "f = ['Cats','like','dogs','as','much','cats.'][1,2,3,4,5,4,3,2,6]"
pattern = 'f = (?P<words>\[.*?\])(?P<numbers>\[.*?\])'

match = re.match(pattern, data)
words = match.group('words')
numbers = match.group('numbers')

print(words)
print(numbers)

< Сильный > Выход

['Cats','like','dogs','as','much','cats.']
[1,2,3,4,5,4,3,2,6]
1
Tagc 6 Янв 2017 в 18:12