Meddelande
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 "".
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:
Pistolero skrev:
re.sub() => https://www.tutorialspoint.com/python/p … ssions.htm
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!
Senast redigerat av xam (2016-11-30 22:52)