Trädvy Permalänk
Medlem
Registrerad
Jun 2004

Hjälp med python. Readlines

Försöker skapa ett program som läser in de första två raderna i alla textfiler i angiven path och skriver ut dessa. Har stött på lite problem.

1. Om jag inte anger någon path som argument via command line (jag gör detta via linux command line) så får jag:

Please provide a path
Traceback (most recent call last):
File "print2lines.py", line 11, in <module>
os.chdir(sys.argv[1])
IndexError: list index out of range

2. Om jag anger en path som argument tex /home/ så händer absolut ingenting?

Detta är koden:

#!/usr/bin/python import glob, os import sys #Check to see that path was privided if len(sys.argv) < 2: print "Please provide a path" #Find files in path given os.chdir(sys.argv[1]) #Chose the ones with txt extension for file in glob.glob("*.txt"): try: #Read and output first two lines of txt file with open(file) as f: line1, line2 = next(f), next(f, " ") #Catch exception errors except IOError: print "Failed to read " + file

La till code-taggar
Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Gjorde koden lite mer läsbar med kodtaggar

Trädvy Permalänk
Medlem
Plats
Sthlm
Registrerad
Mar 2011

Du triggar ju:
if len(sys.argv) < 2:
print "Please provide a path"

Om du inte anger path så gissar jag alltså på att len(sys.argv) == 0 och därmed triggas den. Du går däremot ändå vidare, du avslutar inte programmet. Sedan kollar du på plats [1] (vilket är andra platsen) i listan, som dock inte existerar då vi redan vet att längden är kortare än 2, vilket innebär att [1] inte kan existera. Därmed listindex out of range.

Du kanske tänkte lägga resterande koder i en else-sats? eller en break; i if len(sys.argv) < 2: ? Något måste du iaf göra för att inte gå vidare med programmet ifall if-satsen faktiskt stämmer.

|Define XL | AX850W | P8P67 EVO | 2600K | NH-C14 | GTX 980 | Vengeance 2x4GB | 520 240 GB + VelociRaptor 160gb+ F1 1TB + Green 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Essence STX | DT880 PRO @ 250 ohm + Modmic V4| MK-85 Pro (Brown)|5K Laser|

Trädvy Permalänk
Medlem
Registrerad
Jun 2004

@Mithras:

Tack!

Jag löste detta med sys.exit()

Har dock fortfarande problem med att om jag anger en path så printar den inte raderna?

Trädvy Permalänk
Medlem
Registrerad
Mar 2007
Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Mithras:

Om du inte anger path så gissar jag alltså på att len(sys.argv) == 0 och därmed triggas den.

len(sys.argv) är alltid minst 1, argv[0] innehåller info om vad som körs, t.ex. scriptets namn om man kör ett script (se dokumentation).

Skrivet av TrIff:

Har dock fortfarande problem med att om jag anger en path så printar den inte raderna?

Du har ingen kod som skriver ut raderna, så det är ju inte så konstigt Du sparar bara raderna i line1 och line2, som du sen inte använder till något.

Och om du sen undrar varför du får en massa tomma rader i utskriften så beror det på att next() läser in en hel rad inklusive nyradstecken, och eftersom print lägger till egna nyradstecken så blir det dubbelt. Jag kan inte Python så jag har inte koll på hur man normalt brukar göra, men jag antar att du kan använda rstrip på strängarna för att strippa nyradstecken i slutet av dem.

Trädvy Permalänk
Medlem
Plats
Sthlm
Registrerad
Mar 2011
Skrivet av TrIff:

@Mithras:

Tack!

Jag löste detta med sys.exit()

Har dock fortfarande problem med att om jag anger en path så printar den inte raderna?

Ser ingen print för raderna

|Define XL | AX850W | P8P67 EVO | 2600K | NH-C14 | GTX 980 | Vengeance 2x4GB | 520 240 GB + VelociRaptor 160gb+ F1 1TB + Green 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Essence STX | DT880 PRO @ 250 ohm + Modmic V4| MK-85 Pro (Brown)|5K Laser|

Trädvy Permalänk
Medlem
Registrerad
Jun 2004
Skrivet av civ1:
Skrivet av perost:

len(sys.argv) är alltid minst 1, argv[0] innehåller info om vad som körs, t.ex. scriptets namn om man kör ett script (se dokumentation).

Du har ingen kod som skriver ut raderna, så det är ju inte så konstigt Du sparar bara raderna i line1 och line2, som du sen inte använder till något.

Och om du sen undrar varför du får en massa tomma rader i utskriften så beror det på att next() läser in en hel rad inklusive nyradstecken, och eftersom print lägger till egna nyradstecken så blir det dubbelt. Jag kan inte Python så jag har inte koll på hur man normalt brukar göra, men jag antar att du kan använda rstrip på strängarna för att strippa nyradstecken i slutet av dem.

Skrivet av Mithras:

Ser ingen print för raderna

Tack allihopa!

Det fungerar nu. Men jag ska tydligen göra detta "Skriptet ska kunna hantera relativa sökvägar på katalognamnet". Vad betyder ens det?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av TrIff:

Det fungerar nu. Men jag ska tydligen göra detta "Skriptet ska kunna hantera relativa sökvägar på katalognamnet". Vad betyder ens det?

En relativ sökväg är en sökväg som är relativ den nuvarande arbetskatalogen. D.v.s. om du anropar chdir('test') så betyder det att du vill gå in i katalogen test som finns i den katalog du befinner dig i. Motsatsen är en absolut sökväg, t.ex. chdir('/usr/bin') eller chdir('C:/windows'), d.v.s. en sökväg som börjar i roten av filsystemet. chdir hanterar redan både relativa och absoluta sökvägar, så jag antar att du redan uppfyller det kravet.