Permalänk
Medlem

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
Permalänk
Hedersmedlem

Gjorde koden lite mer läsbar med kodtaggar

Permalänk
Medlem

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.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem

@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?

Permalänk
Medlem
Permalänk
Medlem
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.

Permalänk
Medlem
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

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem
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?

Permalänk
Medlem
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.