2012-02-19 15 views
27

To jest mój problem.Pasek w języku Python z n

Próbuję odczytać plik tekstowy, a następnie przekonwertować wiersze na zmienne. Plik tekstowy ma w sobie \n i \t, choć nie wiem, jak się go pozbyć.

Próbowałem używać line.strip(), ale to się nie zdarzyło i dostałem błąd, gdy chciałem przekonwertować materiał na pływające obiekty. Potem spróbowałem line.strip("\n"), ale to też nie działało. Mój program działa dobrze, gdy wyjmuję z pliku tekstowego plik \t i \n, ale jest to część zadania, które pozwala mu pracować z nimi.

Naprawdę nie wiem, dlaczego to nie działa. Dzięki za pomoc.

+6

Czy możesz podać fragment swojego pliku tekstowego? – Josh

+2

Pasek usuwa tylko białe znaki od początku i końca wiersza. Jeśli masz karty w środku linii, nie usuniesz ich. – Swiss

+2

Warto zauważyć, że "\ n" nie jest znakiem powrotu na wszystkich systemach. Może być konieczne usunięcie "\ n", "\ r" lub "\ r \ n". Jeśli pokażesz kompletny kod, który wypróbowałeś i dane wejściowe, może to być łatwiejsze do rozwiązania. –

Odpowiedz

1

pythony biblioteka csv jest na to dobra.

http://docs.python.org/library/csv.html

CSV = Wartości rozdzielone przecinkami, ale jeśli ustawić separator = \ t, to działa na karcie wartości oddzielonych zbyt.

62

Powinieneś być w stanie używać line.strip('\n') i line.strip('\t'). Ale te nie modyfikują zmiennej line ... po prostu zwracają ciąg znaków z usuniętymi \n i \t. Musisz więc zrobić coś takiego, jak:

line = line.strip('\n') 
line = line.strip('\t') 

To powinno działać w przypadku usuwania od początku i końca. Jeśli masz \n i \t w środku łańcucha, trzeba zrobić

line = line.replace('\n','') 
line = line.replace('\t','') 

zastąpić \n i \t z nicości.

0

Często, w zależności od sposobu czytać wiersze, aby pozbyć się \ n od myline, można wziąć myline [: - 1] od \ n jest ostatnim znakiem myline.

Dla „\ t” można użyć replace() lub taśmy()

1

Jeśli próbujesz konwertować linie pływaków rozdzielonych tabulatorami, a potem po prostu float(line) spróbuje przekształcić całą linię do jeden float, który zawiedzie, jeśli jest więcej niż jeden. Korzystanie z strip, aby pozbyć się wiodących i kończących białych znaków, nie pomoże temu podstawowemu problemowi.

Może musisz split każdej linii na kawałki i zrobić coś z każdym kawałkiem?

2

Co powiesz na użycie wzoru pythonowego regex?

import re 
f = open('test.txt', 'r') 
strings = re.findall(r"\S+", f.read()) 

oraz za przypadek line.strip() nie zadziała, ponieważ Python usuwa tylko początkowe i końcowe znaki

Od Python Docs - Zwraca kopię napisu z wiodące i końcowe znaki usunięte. Jeśli pominięto znaki lub Brak, znaki białych znaków są usuwane.Jeśli podano, a nie Brak, znaki muszą być ciągiem znaków; znaki w łańcuchu zostaną usunięte z obu końców łańcucha, do którego ta metoda jest wywoływana.

16

Metoda strip() domyślnie usuwa spacje, więc nie ma potrzeby wywoływania jej z parametrami takimi jak "\ t" lub "\ n". Jednak ciągi znaków w Pythonie są niezmienne i nie można ich modyfikować, tzn. Wywołanie line.strip() nie zmieni obiektu line. Wynikiem jest nowy ciąg, który jest zwracany przez połączenie.

Jak już wspomniano, byłoby pomocne, gdybyś wysłał przykład ze swojego pliku wejściowego. Jeśli w każdym wierszu znajduje się więcej niż jeden numer, to nie jest to funkcja, której należy użyć. Zamiast tego powinieneś użyć split(), która jest również metodą łańcuchową.

Podsumowując, przy założeniu, że każda linia zawiera kilka pływaków oddzielone spacją, i że chcesz zbudować listę wszystkich numerów, można spróbować wykonać następujące czynności:

floats = [] 
with open(filename) as f: 
    for line in f: 
     floats.extend([float(number) for number in line.split()]) 
0

Można użyć:

mylist = [] 
# Assuming that you have loaded data into a lines variable. 
for line in lines: 
    mylist.append(line.strip().split('\t') 

, aby uzyskać listę pytonów z wartościami pól dla wszystkich wierszy danych.