Mam następujący kod:

check = open(a, 'r')
line =check.readlines()
for items in line:
    breakup= items.split()
    length = (len(breakup)-1)
    number[0], salary[1], position[2], oname[3:length], first[-1] = breakup
    data.append(tuple([first, oname, number, position, salary]))

Ten kawałek kodu odczytuje z pliku tekstowego, który ma ogólne informacje o E.G:

15674 24000 Manager Gregory the 1st John

Próbuję użyć Pętli do pętli, aby dołączyć informacje do danych w kolejności, o którą zapytałem, więc powyższe informacje wyjdzie jako:

('John', 'Gregory the 1st', 15674, 'Manager', 24000)

Powód, dla którego mam łączną krojenie z pozycji 3 do przedostatni, jest one może być dowolna liczba nazwisk, ale imię zawsze będzie jedną pozycją, więc jestem w 100% pewien, że mogę nazwać go z pozycji [-1]

Problem, który mam, to nie działa. Kod przeczyta plik poprawnie i przełam go prawidłowo jednak nie mogę go poprawnie zmienić.

1
Softey 29 listopad 2013, 01:56

2 odpowiedzi

Najlepsza odpowiedź

Musisz podzielić swoją linię inaczej, a następnie przypisać części bez Przydziały indeksu i plasterków:

number, salary, position, rest = items.split(None, 3)
oname, first = rest.rsplit(None, 1)
data.append((first, oname, number, position, salary))

To zachowuje przestrzenie w polu oname. Pierwsze połączenie dzieli tylko 3 razy, dając im pierwsze trzy pola, a pozostała część. Pozostała część w rest jest następnie podzielona z prawej strony , aby dać Ci oname i first.

Próbny:

>>> items = '15674 24000 Manager Gregory the 1st John\n'
>>> number, salary, position, rest = items.split(None, 3)
>>> oname, first = rest.rsplit(None, 1)
>>> first, oname, number, position, salary
('John', 'Gregory the 1st', '15674', 'Manager', '24000')
5
Martijn Pieters 28 listopad 2013, 22:00

Co powiesz na to? Dzieli każdą linię do żetonów, a następnie stawia każdy żeton w swoim właściwym miejscu. Robiłeś rzeczy do tyłu - powinieneś indeksować listę żetonów, a nie zmiennych, do których chcesz je przypisać. Zakłada to, że "menedżer" nie będzie zawierać spacji - w przeciwnym razie menedżer i nazwa byłyby niejednoznaczne.

data = []
with open(a,r) as f:
    for lines in f:
        toks = lines.split()
        data.append((toks[-1], toks[3:-1], int(toks[0]), toks[2], int(toks[1])))

Spowoduje to łączność listy słów, a nie łańcuch ze spacjami w nim. Jeśli chcesz, aby był ciągiem, wymień toks[3:-1] za pomocą " ".join(toks[3:-1]).

2
amaurea 28 listopad 2013, 22:09