Разобрать разделенную пробелами строку с именами - PullRequest
0 голосов
/ 14 декабря 2018

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

Формат:

Фамилия Имя Фамилия значение1 значение2

Фамилия может быть Ван Хорн или Робертс или Глупая Фамилия - трудно определить, сколько пробелов.

FirstName может быть одинаковым - несколько слов с пробелами.

Value1 - одно из 4 фиксированных значений, но также содержит пробелы

Value2 - тот же формат, что и Value1

Я думаю, что Value1 имеет фиксированные 4 известные значения, которые я должен иметьпо крайней мере, чтобы получить «LastName FirstName», Value1, Value2

Я хочу преобразовать файл этих данных в файл CAB.Предпочтительно LastName, FirstName, Value1, Value2

Хотя я борюсь с логикой.

Спасибо за любую помощь, которую кто-либо может оказать, чтобы помочь мне.

Код, который я пробовал (его части с этого сайта):

input_file = open("file.txt", "r")
for line in input_file:
    (LastName, FirstName, Value1, Value2) = line.strip().split(" ")
    print(LastName, ",", FirstName, ",", Value1, ",", Value2, "\n")
input_file.close()

File.txt:

Van Horn Sir Steven Value1 v1 Value2 V2

Ожидаемый результат:

Van Horn, Sir Steven, Value1 v1, Value2 V2

Примет:

Van Horn Sir Steve, Value V1, Value V2

Ошибка:

Traceback (most recent call last):
  File "C:\Users\tokyomike\Desktop\parse.py", line 4, in <module>
    (LastName, FirstName, Value1, Value2) = line.strip().split(" ")
ValueError: too many values to unpack (expected 4)

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

split() функция удаляет все пробелы и принимает каждое как отдельный элемент.Поэтому в вашем случае Van Horn Sir Steven Value1 v1 Value2 V2 у вас будет 8 отдельных значений, но вы распаковываете их только под 4 переменных LastName, FirstName, Value1, Value2.Это то, что вызывает ошибку ValueError: too many values to unpack (expected 4).Давайте попробуем:

x,a,s = [1,2,3,4]

Вывод:

C:\Users\Desktop>py x.py
Traceback (most recent call last):
  File "x.py", line 1, in <module>
    x,a,s = [1,2,3,4]
ValueError: too many values to unpack (expected 3)

Точно такая же ошибка.

Решение:

import re

string = 'Van Horn Sir Steven Value1 v1 Value2 V2'
str = re.findall(r'(\w+?\s\w+)', string)
str = ', '.join(str)
print(str)

Вывод:

C:\Users\Desktop>py x.py
Van Horn, Sir Steven, Value1 v1, Value2 V2

В вашем случае:

import re

input_file = open("file.txt", "r")
for line in input_file:
    str = re.findall(r'(\w+?\s\w+)', line)
    str = ', '.join(str)
    print(str)
input_file.close()
0 голосов
/ 14 декабря 2018

Итак, прежде всего, относительно вашего исключения: split() разбивает данную строку на каждый .Это, конечно, приводит к тому, что список длиннее четырех предметов, в которые вы пытаетесь его распаковать:

line = "Van Horn Sir Steven Value1 v1 Value2 V2"
print(line.split())  # ->['Van', 'Horn', 'Sir', 'Steven', 'Value1', 'v1', 'Value2', 'V2']

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

line = "Van Horn Sir Steven Value1 v1 Value2 V2"

*name, key1, val1, key2, val2 = line.split()
print(f"name: {name}, {key1}: {val1}, {key2}: {val2}")

# Output-> name: ['Van', 'Horn', 'Sir', 'Steven'], Value1: v1, Value2: V2

Это оставиту вас есть список элементов в name.

. В этот момент вы можете заметить: у вашего подхода в целом есть один существенный недостаток.Мы не можем знать, где начинается фамилия / заканчивается фамилия, потому что они могут иметь любое количество элементов.Так что это в принципе невозможно решить.

Если только в вашем примере не указано «сэр».Если каждое имя имеет «сэр», «мадам», «мистер»или, в принципе, любые фиксированные ключевые слова, можно создать список этих ключевых слов и разделить список при первом появлении одного из этих слов на имя и фамилию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...