Meddelande

Du befinner dig just nu på en äldre version av Pluggakuten, gamla.pluggakuten.se. Nya Pluggakuten lanserades den 6 februari 2017 och du finner forumet på www.pluggakuten.se.

På gamla.pluggakuten.se kan du fortfarande läsa frågorna och svaren som ställts, men du kan inte skapa ett nytt konto eller nya trådar. Nya frågor och nytt konto skapar du på det nya forumet, välkommen dit!

Python text file

xam
Medlem

Offline

Registrerad: 2016-10-03
Inlägg: 44

Python text file

Hej.
Jag undrar hur man kan gå till väga för att printa ut en viss specifik del av en textrad.
Jag öppnar alltså följande text fil (file = open("log.txt") i Python:

(text fil)

Line 0 - - GET information/links.html HTTP/1.0" 200 85
Line 1 - - GET information/links.html HTTP/1.2" 200 82
Line 2 - - GET infoformation/links.html HTTP/1.2" 223 82
Line 3 - - GET information/research.html HTTP/1.0" 200 1550

Jag vet redan hur man kan printa ut alla rader eller en specifik rad.
Det jag undrar över är hur man ska kunna printa ut texten efter GET (alltså all text till höger om GET)?

Resultatet ska ser ut så här:

information/links.html HTTP/1.0" 200 85
information/links.html HTTP/1.2" 200 82
infoformation/links.html HTTP/1.2" 223 82
information/research.html HTTP/1.0" 200 1550

 
Pistolero
Medlem

Offline

Registrerad: 2008-12-09
Inlägg: 633

Re: Python text file

Du skulle väl kunna använda replace(), alternativt kan du använda reg.sub(). Du ersätter då en sökparameter med något annat, t.ex. str.replace("GET ", ""), då kommer texten "GET " i strängen att ersättas med "". smile

str.replace() => https://www.tutorialspoint.com/python/s … eplace.htm
re.sub() => https://www.tutorialspoint.com/python/p … ssions.htm

Edit:
Och det körs som standard bara en gång, vilket innebär att om du har en sträng som ser ut så här:

GET information/.html GET HTTP/1.0" 200 85

Så kommer bara första "GET " att ersättas med "" och vi får "information/.html GET HTTP/1.0" 200 85".

Vill man dock bytta ut alla "GET " i strängen, så att vi får "information/.html HTTP/1.0" 200 85", så kan man också göra det genom att ange hur många körningar sm ska göras i parametrarna. I annat fall, om antalet är okänt, så får man söka manuellt igenom strängen efter "GET " och ersätta dessa tills inga fler "GET " påträffas.

Men i det här fallet så borde det räka med bara replace("GET ", "") eftersom det alltid kommer vara "GET " i början av strängen som ska bort och resten ska lämnas orört.

Senast redigerat av Pistolero (2016-11-29 04:28)

 
xam
Medlem

Offline

Registrerad: 2016-10-03
Inlägg: 44

Re: Python text file

Man kan alltså byta ut ett ord till "". Bra tips!
Jag kanske vara lite otydlig men det förekommer text innan GET t.ex. Line 3 - - GET och Line 2 - - GET

Jag vill alltså inte bara ta bort ordet GET utan allt som förekommer till vänster om - information/research.html HTTP/1.0" 200 1550.

Senast redigerat av xam (2016-11-29 17:25)

 
sneagel
F.d. moderator

Offline

Registrerad: 2008-02-29
Inlägg: 13563

Re: Python text file

Kan inte Python så väl men googlade lite och finns ju en metod i string-klassen som heter find, som letar efter ett givet mönster i en given sträng och returnerad index för där mönstret startar.

str1 = "hej på dig"
str2 = "hej"
str3 = "på"

print str1.find(str2)
  >> 0 ("hej" börjar på index 0 i str1)

print str1.find(str3)
  >> 4 ("på" börjar på index 4 i str1)

Så du borde kunna leta efter GET på det här sättet.

 
annlu
Medlem

Offline

Registrerad: 2016-11-02
Inlägg: 58

Re: Python text file

Jag tycker Pistoleros andra förslag lämpar sig utmärkt när du vill ta bort början på varje textrad:

Denna funktion gör alltså en find (som i sneagels förslag) och sedan en replace (som du redan bekantat dig med).

Syntaxen är re.sub(pattern, repl, string) där det pattern du anger söks upp i din string och byts ut mot repl.

Pattern är ett uttryck som skrivs med Regular Expressions (reguljära uttryck) (eller regex) som är jättebra att kunna när man programmerar. De första gångerna man kommer i kontakt med det kan det verka lite bökigt, men det ger sig ju mer exempel man ser och ju mer man experimenterar själv.

För att byta ut början av dina textrader kan du använda tecknet ^ som indikerar början av en string.
Det verkar också som Line 0, Line 1, Line 2, … ökar så du vill matcha alla siffror efter ordet Line. En siffra kan anges som [0-9] eller \d. Med ett plustecken efter indikerar man att man menar 1 eller fler siffror.

Uttrycket "^Line \d+" matchar alltså "Line 1", "Line 2", "Line 53", "Line 108" etc. men inget som eventuellt kommer efter siffrorna.

Kan du själv utöka regexuttrycket ovan så du matchar hela början av dina textrader fram till efter GET? Allt det ska ju bytas ut mot "".

re tillhör inte de inbyggda funktionerna så för att använda det får du importera:
>> import re
>> ny_textrad = re.sub("^Line \d+", "", textrad)   # Utöka regexuttrycket så du matchar hela vägen till efter GET


Vill du inte använda re.sub() kan du göra som sneagel föreslår med find (som förresten också kan söka efter regexuttryck). Det är en roligt och lite mer "pussligt" lösning istället för att ta genvägen via re.sub(). Sök exempelvis efter ordet GET (eller "- GET"), få tillbaka index för var detta pattern börjar , och skapa den nya textraden genom att "hugga av" den gamla:
>>ny_textrad = text_rad[index:], alltså från det index du vill börja den nya textraden, till slutet.

 
xam
Medlem

Offline

Registrerad: 2016-10-03
Inlägg: 44

Re: Python text file

Tack för en väldigt bra rådsförsamling här och hela alltet av tips som jag fått! smile

Senast redigerat av xam (2016-11-30 22:52)

 


Sidfot

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Powered by Mattecentrum
 |  Denna sida använder cookies |  Kontakta oss |  Feedback |