8 svar
140 visningar
Ygolopot behöver inte mer hjälp
Ygolopot 215
Postad: 19 maj 2022 10:47 Redigerad: 19 maj 2022 10:47

Python string som argument i funktion, sluta tolka \t, \n etc. som escape code

Hej!

Jag skriver på en funciton som ska ta en textfil som följer ett visst format och ge ut datan i en pandas df. Mitt problem är dock att:

"C:\Users\username\path_name\the_file.txt"

\t här inte tolkas som en vanlig del av min sträng. Jag vet att jag kan skriva:

r"C:\Users\username\path_name\the_file.txt"

Men, detta ska vara en del av en funktion där tanken är att:

def min_konverterare(file_path, divider)

Jag ska ta in en sträng och berätta vad som delar upp datan och jag vill kunna ge vilken file path som helst som argument och då kan jag inte riktigt använda r"C:\Users\username\path_name\the_file.txt" som lösning då 

"C:\Users\username\path_name\the_file.txt" heter file_path i scopet för funktionen

 

Just nu kan jag inte köra funktionen alls för jag får:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Så fort raden med strängen läses in.

Jag har sett massor av lösningar på stack overflow men ingen där man tar in en path som argument.

Någon som har en lösning?

Tack på förhand!

Lindehaven 820 – Lärare
Postad: 19 maj 2022 11:38

Hmmm, Windows... Har du provat "C:\\Users\\username\\path_name\\the_file.txt" ?

Ygolopot 215
Postad: 19 maj 2022 11:44

Ja det verkar fungera! Min tanke är att användaren av funktionen ska kunna kopiera path till valfri txt-fil och sen köra funktionen och få ut ett pandas dataframe, men jag lyckas liksom inte manipulera strängen överhuvudtaget eftersom programmet kraschar så fort den sträng jag har i mitt exempel läses in. Så jag lyckas liksom inte automatisera att det ska bli \\ i strängen.

Så då kan man ju köra r framför som i:  r"C:\Users\username\path_name\the_file.txt"

Men då fastnar jag istället på att då argumenet i funktionen är path-name som är en sträng så vet jag inte hur jag ska lägga till r framför i själva scopet för funktionen.

Spontant känns det som att det är fel av mig att jobba med paths i sträng-format och att jag kanske borde borde hantera detta på något sätt innan men kommer inte på hur :(

CurtJ Online 1200
Postad: 19 maj 2022 11:51

Kan följande funka på något lämpligt ställe i koden?

path.replace('\\', '\\\\')

CurtJ Online 1200
Postad: 19 maj 2022 11:52

Annars är pathlib ett bra bibliotek för att hantera sökvägar. Vet inte om det har funktionalitet för ditt use case med att kopiera in sökvägen men du kan ju titta på det.

Lindehaven 820 – Lärare
Postad: 19 maj 2022 11:59

Du kan t ex låta funktionen ersätta alla "\" med "\\" innan den öppnar filen.

Ygolopot 215
Postad: 19 maj 2022 12:30

Tack så mycket för svaren! 

Just nu ser min funktion ut såhär:

def txt_to_pandas_converter(file_path, sep_char):
    '''
    Write some documentation here
    '''
    index = 0
    with open(file_path, encoding='utf-8') as f:
        failed_columns = []
        failed_index = []
        errors = []
        col_names = f.readline()
        df = pd.DataFrame(columns=[col_names.split(sep_char)])
        for line in f:
            to_be_added = line.split(sep_char)
            try:
                df.loc[index] = line.split(sep_char)
            except Exception as error:
                errors.append(error)
                failed_columns.append(to_be_added)
                failed_index.append(index)
            index = index + 1
            if index == 600:
                break
    return df, failed_columns, failed_index

Och det jag vill köra är t.ex:

test = txt_to_pandas_converter("C:\Users\username\path_name\the_file.txt", "|")

Jag tror mitt problem är att jag inte hinner göra något med strängen alls innan programmet kraschar, i VScode som jag kör så är \t gult medan övriga delar av strängen har orange färg.

Har ni något exempel på hur jag gör för att erstätta '\' med '\\'?

CurtJ Online 1200
Postad: 19 maj 2022 12:31 Redigerad: 19 maj 2022 12:39

se #4

Men du anger strängen i din kod och då måste du antingen skriva \\ eller använda raw-format

Om du läser in strängen med input så hanterar Python escape-problematiken

Ygolopot 215
Postad: 21 maj 2022 15:54

Alright! Tack så mycket för hjälpen, har nog en lösning på g som jag kan skriva in här om ett tag! :)

Svara
Close